结构型模式
- 格式:ppt
- 大小:103.00 KB
- 文档页数:17
设计模式(1、创造型2、结构型、3⾏为型)
设计模式六⼤原则:单⼀职责、⾥⽒替换、依赖倒置、最⼩接⼝、迪⽶特、开闭
这些只能叫原则,叫建议,没有实际的招数
23种设计模式,就是具体的招数,他们可以分成三⼤类。
1、创造型2、结构型、3⾏为型。
创造型设计模式关注对象的创建。
就是咱们的new().单例模式、原型模式、⼯⼚⽅法、抽象⼯⼚、建造者模式
结构型设计模式关注类与类之间的关系。
继承或者组合。
说⽩了就是包⼀层。
适配器模式、代理模式、装饰器模式、外观模式、组合模式、桥接模式、享元模式
⾏为型设计模式关注对象和⾏为的分离。
流程⽤的多些,说⽩了就是把逻辑丢出去,具体逻辑上端⾃⼰实现,下端只做流程。
模板⽅法设计模式、观察者模式、责任链模式
23种设计模式是前辈们总结出来的。
是为了解决具体的⼀类问题总结出来的,我遇到好多⼩伙伴觉得设计模式很⽜逼。
其实没那么伟⼤。
某种设计模式解决⼀类问题也会带来另⼀种问题。
所以合理应⽤才是最好的。
所以,有些设计模式不是必须应⽤进去。
不必强求。
我也是后来者,对前辈们总结的⼀些理解,学习和应⽤。
希望也能帮到看到这⾥的求学者。
下⾯⼏章。
都是对这23种设计模式的解读,不过我是总结成三⼤类。
尽量⽤最普通的话去阐述。
设计模式——结构型模式(包含7种)结构型设计模式是从程序的结构上解决模块之间的耦合问题。
包括以下七种模式:1.Adapte适配器模式:Adapter模式通过类的继承或者对象的组合侧重于转换已有的接⼝,类适配器采⽤“多继承”的实现⽅式,带来了不良的⾼耦合,所以⼀般不推荐使⽤。
对象适配器采⽤“对象组合”的⽅式,更符合松耦合精神。
例如:笔记本电源适配器,可以将220v转化为适合笔记本使⽤的电压。
2.Bridge桥接模式:将抽象部分与实现部分分离,使它们都可以独⽴的变化。
减少因变化带来的代码的修改量。
例如:经典例⼦,电灯开关,开关的⽬的是将设备打开或关闭,产⽣的效果不同。
posite组合模式:将对象组合成树形结构以表⽰“部分-整体”的层次结构。
Composite模式使得客户对单个对象和组合对象的使⽤具有⼀致性。
从⽽解决了解决客户程序与复杂对象容器的解耦,即:通过继承统⼀的接⼝,我们可以将容器对象及其⼦对象看成同⼀类对象使⽤,以减少对象使⽤中的复杂度。
例如:让⽤户⼀致地使⽤单个对象和组合对象,1+2和(1+1)+(2*3)都是合法的表达式。
单个与整体都可以进⾏加法运算符的操作。
4.Decorator装饰模式:动态地给⼀个对象添加⼀些额外的职责。
就增加功能来说,Decorator模式相⽐⽣成⼦类更为灵活。
[GOF 《设计模式》]Decorator模式采⽤对象组合⽽⾮继承的⼿法,实现了在运⾏时动态的扩展对象功能的能⼒,⽽且可以根据需要扩展多个功能,避免了单独使⽤继承带来的“灵活性差”和“多⼦类衍⽣问题”。
同时它很好地符合⾯向对象设计原则中“优先使⽤对象组合⽽⾮继承”和“开放-封闭”原则。
例如:⼀幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
5.Facade外观模式:为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,简化接⼝。
例如:我们拨打10086,可以办理,彩铃,⼿机报,全时通等业务(⼦对象),⽽10086则是为⼦对象所使⽤的⼀致界⾯。
设计模式主要分三个类型:创建型、结构型和行为型。
创建型有:一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点二、二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:六、六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、十、State,状态模式:允许对象在其内部状态改变时改变他的行为。
对象看起来似乎改变了他的类。
十一、十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系十三、十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
体系结构模式介绍在软件开发中,体系结构模式是指为了实现某一特定系统或项目而构建的整体架构。
它包含了系统的组织结构、模块之间的关系、数据流和控制流等关键要素。
体系结构模式与设计模式不同,它强调的是系统整体的架构,而设计模式更关注单个模块或组件的设计。
体系结构模式是一种高级的设计模式,它提供了一种对系统进行划分、组织和管理的方法。
通过使用体系结构模式,可以使系统具有良好的可维护性、可扩展性、可重用性和可测试性,并且能够满足系统的性能、可靠性和安全性要求。
体系结构模式的分类体系结构模式可以分为三大类:结构型体系结构模式、行为型体系结构模式和并发型体系结构模式。
结构型体系结构模式结构型体系结构模式关注系统中不同模块或组件的结构以及它们之间的关系。
常见的结构型体系结构模式包括:1. 分层体系结构模式分层体系结构模式将系统分为不同的层次,每一层都负责处理特定的功能。
通常,每一层只与相邻的一层进行通信,使得系统更易于维护和扩展。
2. 客户端-服务器模式客户端-服务器模式将系统分为客户端和服务器两部分,客户端负责发送请求,服务器负责处理请求并返回响应。
这种模式常用于分布式系统和互联网应用中。
MVC模式是一种常用的软件架构模式,它将系统分为模型(Model)、视图(View)和控制器(Controller)三部分。
模型负责处理数据,视图负责展示数据,控制器负责接收用户的输入并进行相应的处理。
行为型体系结构模式行为型体系结构模式关注系统中不同模块或组件的行为以及它们之间的协作方式。
常见的行为型体系结构模式包括:1. 发布-订阅模式发布-订阅模式是一种消息通信模式,它包括发布者(Publisher)和订阅者(Subscriber)两个角色。
发布者负责发送消息,订阅者负责接收消息,并且发布者和订阅者之间并没有直接的依赖关系。
2. 中介者模式中介者模式是一种协调多个对象之间交互的模式。
它包括中介者(Mediator)和各个对象之间的同事对象(Colleague)。
1、适配器模式意图和适用性:定义:将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适用性:以下情况使用A d a p t e r模式:●你想使用一个已经存在的类,而它的接口不符合你的需求。
●你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
●(仅适用于对象A d a p t e r)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。
对象适配器可以适配它的父类接口。
2、装饰者模式意图和适用性:定义:装饰模式可以动态的给一个对象附加一些功能,对于扩展功能来说,装饰模式(合成)比生成子类的方式(继承)更加灵活。
意图(Intent):动态地给一个对象增加一些额外的职责。
就增加功能而言,Decorator模式比生成子类更为灵活。
以下情况使用Decorator模式:●在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
●当不能采用生成子类的方法进行扩充时。
一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
另一种情况时因为类定义被隐藏,或类定义不能用于生成子类。
3、桥接模式的意图和适用性:定义:将问题的抽象和实现分离开来,通过用聚合代替继承来解决子类爆炸性增长的问题。
传统地,当一个抽象可能有多个实现时,通常用继承来协调它们。
抽象类定义该抽象的接口,而具体的子类则用不同的方式加以实现。
但是此方法有时不够灵活。
继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改。
扩充和重用。
●桥接模式的作用就是将抽象部分与实际部分分离,使它可以独立的变化。
4、享元模式的意图和适用性:意图(Intent):运用共享技术有效地支持大量细粒度的对象。
适用性:●一个应用程序使用了大量的对象。
●完全由于使用大量的对象,造成很大的存储开销。
结构型模式代理模式:由于某些原因需要给某对象提供⼀个代理以控制对该对象的访问。
这时,访问对象不适合或者不能直接引⽤⽬标对象,代理对象作为访问对象和⽬标对象之间的中介。
1. 模式的结构代理模式的主要⾓⾊如下。
1. 抽象主题(Subject)类:通过接⼝或抽象类声明真实主题和代理对象实现的业务⽅法。
2. 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引⽤的对象。
3. 代理(Proxy)类:提供了与真实主题相同的接⼝,其内部含有对真实主题的引⽤,它可以访问、控制或扩展真实主题的功能。
结构public class ProxyTest {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.Request();}}//抽象主题interface Subject {void Request();}//真实主题class RealSubject implements Subject {public void Request() {System.out.println("访问真实主题⽅法...");}}//代理class Proxy implements Subject {private RealSubject realSubject;public void Request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.Request();postRequest();}public void preRequest() {System.out.println("访问真实主题之前的预处理。
");}public void postRequest() {System.out.println("访问真实主题之后的后续处理。
软件架构设计模式随着面向对象技术的发展和广泛应用,设计模式不再是一个新兴的名词,它已逐步成为系统架构人员、设计人员、分析人员以及程序开发人员所需掌握的基本技能之一。
设计模式已广泛应用于面向对象的设计和开发,成为面向对象领域的一个重要组成部分。
设计模式通常可分为三类:创建型模式、结构型模式和行为型模式。
1.创建型模式概述创建型模式(CreationalPattern)对类的实例化过程及对象的创建过程进行了抽象,能够使软件模块做到与对象的创建和组织无关。
创建型模式隐藏了对象的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
在掌握创建型模式时,需要回答以下三个问题:创建什么(What)、由谁创建(Who)和何时创建(When)。
创建型模式主要包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。
以下介绍其中使用频率较高的几种模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式。
1.1简单工厂模式简单工厂模式(SimpleFatoryPattern),又称静态工厂方法模式(StaticFactotyMethodPattern),属于类创建型模式。
在简单工厂模式中,定义一个类,可以根据参数的不同返回不同的类的实例,这些类具有公共的父类和一些公共的方法。
简单工厂模式不属于GoF设计模式,它是最简单的工厂模式。
简单工厂模式专门定义一个类来负责创建其他类的实例,这个类称为工厂类,被创建的实例通常都具有共同的父类。
在简单工厂模式中,工厂类包含必要的判断逻辑,决定在什么时候创建哪一个产品类实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品,简单工厂模式通过这种方式实现了对责任的划分。
但是由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响;同时系统扩展较为困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则,并造成工厂逻辑过于复杂。
设计模式(三)——结构型模式1、适配器模式两个不兼容接⼝间的桥梁,使得那些原本由于接⼝不兼容不能⼀起⼯作的那些类可以⼀起⼯作。
将⼀个接⼝转换成客户希望的另⼀个接⼝。
属于结构型模式。
播放器和⾼级播放器接⼝public interface MediaPlayer {public void play(String audioType,String fileName);}public interface AdvancedMediaPlayer {public void playVlc(String fileName);public void playMP4(String fileName);}实现⾼级播放器public class VlcPlayer implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file: "+fileName);}@Overridepublic void playMP4(String fileName) {//System.out.println();}}public class Mp4Player implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {//}@Overridepublic void playMP4(String fileName) {System.out.println("Playing MP4 file: "+fileName);}}创建实现了播放器接⼝的适配器类public class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")){advancedMediaPlayer = new VlcPlayer();}else if (audioType.equalsIgnoreCase("mp4")){advancedMediaPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vld")){advancedMediaPlayer.playVlc(fileName);}else if (audioType.equalsIgnoreCase("mp4")){advancedMediaPlayer.playMP4(fileName);}}}实现类播放器接⼝的实体类MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {//播放mp3⾳乐⽂件的内置⽀持if (audioType.equalsIgnoreCase("mp3")){System.out.println("Playing mp3 file: "+fileName);}//MediaAdapter提供了播放其他⽂件格式的⽀持else if (audioType.equalsIgnoreCase("vlc")||audioType.equalsIgnoreCase("mp4")){mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType,fileName);}else {System.out.println("Invalid media ."+audioType+" format not supported");}}}使⽤MediaPlayerpublic class Main {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3","哈哈");audioPlayer.play("mp4","冰雪⼤冒险");audioPlayer.play("vlc","mind me.");}}2、桥接模式⽤于把抽象化和实现化解耦,使得⼆者可以独⽴变化。