设计模式——09组合模式与装饰模式
- 格式:ppt
- 大小:2.63 MB
- 文档页数:35
设计模式的分类及功能划分设计模式有两种分类⽅法,即根据模式的⽬的来分和根据模式的作⽤的范围来分。
⼀、根据⽬的来分;通过完成什么⼯作划分为创建型模式、结构型模式和⾏为型模式 3 种类型 1、创建型模式:作⽤于对象的创建,将对象的创建与使⽤分离。
其中囊括了单例、原型、⼯⼚⽅法、抽象⼯⼚、建造者5 种创建型模式。
2、结构型模式:将类或对象按某种布局组成更⼤的结构,其中以代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式为主。
3、⾏为型模式:作⽤于类或对象之间相互协作共同完成单个对象⽆法单独完成的任务,以及怎样分配职责。
主要包含了模板⽅法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种⾏为型模式。
⼆、根据作⽤范围来分;根据是⽤于类上还是⽤于对象上划分分为类模式和对象模式两种。
1、类模式:⽤于处理类与⼦类之间的关系,这些关系通过继承来建⽴,在编译时刻便确定下来了。
⼯⼚⽅法、(类)适配器、模板⽅法、解释器均属于该模式。
2、对象模式:⽤于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运⾏时刻是可以变化的,更具动态性。
除了以上 4种,其他的都是对象模式。
设计模式的分类表设计模式的功能1、单例(Singleton)模式:某个类只能⽣成⼀个实例,该类提供了⼀个全局访问点供外部获取该实例,其拓展是有限多例模式。
2、原型(Prototype)模式:将⼀个对象作为原型,通过对其进⾏复制⽽克隆出多个和原型类似的新实例。
3、⼯⼚⽅法(Factory Method)模式:定义⼀个⽤于创建产品的接⼝,由⼦类决定⽣产什么产品。
4、抽象⼯⼚(AbstractFactory)模式:提供⼀个创建产品族的接⼝,其每个⼦类可以⽣产⼀系列相关的产品。
5、建造者(Builder)模式:将⼀个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
6、代理(Proxy)模式:为某对象提供⼀种代理以控制对该对象的访问。
23种设计模式书23种设计模式书是指《设计模式》一书中所介绍的23种常见的软件设计模式。
这些设计模式是在软件开发中经过验证和应用的最佳实践,可以帮助开发人员解决各种常见的设计问题。
本文将依次介绍这23种设计模式,并对每种模式进行简要的说明和应用场景的介绍,以帮助读者更好地理解和应用这些设计模式。
1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
2. 工厂模式(Factory):将对象的创建和使用分离,通过工厂类来创建对象。
3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。
4. 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
5. 原型模式(Prototype):通过复制已有对象来创建新对象,避免了创建过程的复杂性。
6. 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。
7. 桥接模式(Bridge):将抽象部分和实现部分分离,使它们可以独立变化。
8. 过滤器模式(Filter):使用标准来过滤一组对象,获取满足条件的子集。
9. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
10. 装饰器模式(Decorator):动态地给一个对象添加额外的职责,同时又不改变其结构。
11. 外观模式(Facade):提供一个统一的接口,用来访问子系统中的一群接口。
12. 享元模式(Flyweight):通过共享对象来有效地支持大量细粒度的对象。
13. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
14. 责任链模式(Chain of Responsibility):将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。
15. 命令模式(Command):将一个请求封装成一个对象,从而可以用不同的请求对客户进行参数化。
23种设计模式记忆口诀1.单例模式:独一无二,最重要。
2.工厂模式:制造者,无需说。
3.抽象工厂:一族产品,同根源。
4.建造者模式:一步一步,建造家。
5.原型模式:克隆专家,快捷法。
6.适配器模式:转换者,聪明智。
7.桥接模式:结构优化,灵活性。
8.装饰模式:装饰者,美化家。
9.组合模式:树形结构,组合家。
10.外观模式:微缩封装,简洁家。
11.享元模式:享元工厂,节省家。
12.代理模式:替身幕后,保护家。
13.模板方法:算法继承,不变家。
14.策略模式:行为封装,灵活家。
15.命令模式:命令者,有权家。
16.职责链模式:可扩展,级别性。
17.状态模式:状态管理,干净家。
18.观察者模式:被观察,自主家。
19.中介者模式:中介者,沟通家。
20.迭代器模式:循环选择,简化家。
21.访问者模式:动态添加,扩展家。
22.备忘录模式:状态备份,还原家。
23.解释器模式:解释语言,特殊家。
以上23种设计模式,为了更好地记忆,我把它们组合成了一个口诀:最重要的单例模式,工厂与抽象同皇冠。
建造渐进如养家,克隆是原型美化家。
适配器桥接转化家,组合成树形结构家。
装饰装扮美化家,微缩封装外观家。
享元共用节省家,代理替身保护家。
策略模式灵活家,命令者有权家。
职责链扩展级别性,状态干净管理家。
被观察自主家,中介者沟通家。
循环迭代简化家,访问者动态扩展家。
备忘录变化还原家,解释语言特殊家。
这个口诀是通过把每个模式的主要特点和功能用简洁的语句表达出来,然后通过排列组合的方式形成的。
相信这个口诀会让你更容易地记忆这23种设计模式,并且可以在以后的工作中灵活地运用它们。
23种设计模式考题设计模式是软件开发中常用的解决问题的方法论,它们提供了一套经过验证的解决方案,可以帮助开发者更好地组织和设计代码。
下面是23种常见的设计模式的考题及其回答:1. 单例模式:问,请解释什么是单例模式,并说明它的优缺点。
答,单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。
其优点是可以节省系统资源,提高性能;缺点是可能引入全局状态,使代码难以调试和测试。
2. 工厂模式:问,请解释什么是工厂模式,并列举其主要类型。
答,工厂模式是一种创建型设计模式,它将对象的创建过程封装在一个工厂类中。
主要类型包括简单工厂模式、工厂方法模式和抽象工厂模式。
3. 抽象工厂模式:问,请解释什么是抽象工厂模式,并说明它与工厂方法模式的区别。
答,抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或依赖对象的家族。
与工厂方法模式不同的是,抽象工厂模式强调创建一系列相关对象,而不是一个对象。
4. 建造者模式:问,请解释什么是建造者模式,并说明它的优势。
答,建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程分解为多个简单的步骤,并通过一个指导者类来控制构建过程。
其优势是可以灵活地构建不同的产品,同时隐藏了产品的内部结构。
5. 原型模式:问,请解释什么是原型模式,并说明它的适用场景。
答,原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。
适用场景包括需要创建大量相似对象、对象的创建过程复杂或耗时等情况。
6. 适配器模式:问,请解释什么是适配器模式,并说明它的作用。
答,适配器模式是一种结构型设计模式,它将一个类的接口转换成客户端所期望的另一个接口。
它的作用是使原本不兼容的接口能够协同工作。
7. 桥接模式:问,请解释什么是桥接模式,并说明它与适配器模式的区别。
答,桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。
设计模式中英文对照简单工厂模式(Simple Factory Pattern)1)工厂方法模式(Factory Method Pattern)2)抽象工厂模式(Abstract Factory Pattern)3)建造者模式(Builder Pattern)4)原型模式(Prototype Pattern)5)单例模式(Singleton Pattern)6)适配器模式(Adapter Pattern)7)桥梁模式(Bridge Pattern)桥接模式8)组合模式(Composite Pattern)9)装饰模式(Decorator Pattern)10)门面模式(Facade Pattern)外观模式11)享元模式(Flyweight Pattern)12)代理模式(Proxy pattern)13)责任链模式(Chain of Responsibility Pattern)14)命令模式(Command Pattern)15)解释器模式(Interpreter Pattern)16)迭代器模式(Iterator Pattern)17)中介者模式(Mediator Pattern)18)备忘录模式(Memento Pattern)19)观察者模式(Observer Pattern)20)状态模式(State Pattern)21)策略模式(Strategy Pattern)22)模板方法模式(Template Method Pattern)23)访问者模式(Visitor Pattern)THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考24)。
注:文档内容基本上来自于网上,并加上自己的理解而成。
有的觉得网友总结得非常好,就完全照搬下来,供学习之用。
然而,有的摘抄并没有加上原链接和出处,请谅解。
要点:1. 用于处理树形结构的问题中,它模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素内部结构解耦。
2. 组合模式可以优化处理递归或者分级数据结构。
我们可以将组合理解为两个层面的意思,一个是按“整体-部分”的方式一个将复杂过程组成树型结构,另一个层面则是强调整个树的执行要有统一的接口,可以被递归的调用。
3. 应用场景: OS文件系统,JUnit1.(Composite Pattern)组合模式详解1:组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式让你可以优化处理递归或分级数据结构。
有许多关于分级数据结构的例子,使得组合模式非常有用武之地。
关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。
文件系统由目录和文件组成。
每个目录都可以装内容。
目录的内容可以是文件,也可以是目录。
按照这种方式,计算机的文件系统就是以递归结构来组织的。
如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
定义(GoF《设计模式》):将对象组合成树形结构以表示“部分整体”的层次结构。
组合模式使得用户对单个对象和使用具有一致性。
涉及角色:ponent 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。
声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
posite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
23种设计模式详解设计模式是指面向对象编程中,经过多次验证、被广泛接受的代码实现方法。
这些设计模式可以帮助开发者更快地解决问题,提高代码的可读性、可维护性、可扩展性。
目前,常用的设计模式有23种。
下面,我们来详细介绍一下这23种设计模式。
1. 单例模式(Singleton)单例模式是一种只允许生成一个实例的模式。
在实例化对象时,单例模式的生成过程比较特殊,需要先判断该类是否已经实例化过,如果已经实例化,则直接返回已有的实例对象,否则再进行实例化。
2. 工厂模式(Factory)工厂模式是一种生产对象实例的设计模式。
它将对象实例的生成过程封装在一个工厂类中,客户端需要对象时,只需要调用工厂类中对应的方法即可。
3. 抽象工厂模式(Abstract Factory)抽象工厂模式是一种扩展了工厂模式的模式。
它可以生成一系列相关或相互依赖的对象实例。
具体实现时,通常需要定义一个抽象工厂类和一些具体工厂类,来生产各种相关的对象实例。
4. 建造者模式(Builder)建造者模式是一种用于构建复杂对象的模式。
它将一个复杂对象的构建过程分解成多个简单的步骤,然后通过一个指挥者来管理这些步骤的执行,最终构建出一个复杂的对象。
5. 原型模式(Prototype)原型模式是一种通过复制已有对象来创建新对象的模式。
一般来说,系统中的对象包含大量相同或相似的部分,通过复制对象可以帮助我们节省生成对象的时间和资源。
6. 适配器模式(Adapter)适配器模式是一种将不兼容接口转换为兼容接口的模式。
具体实现时,需要定义一个适配器类,该类实现了客户端所期望的接口,而且还包装了原有不兼容的接口,使其能够兼容客户端期望的接口。
7. 桥接模式(Bridge)桥接模式是一种将抽象部分与其实现部分分离开来的模式。
具体实现时,需要定义抽象部分和实现部分的接口,然后定义一个桥接类,将抽象部分和实现部分联系起来。
8. 组合模式(Composite)组合模式是一种将具有相同属性和方法的对象组合成树形结构的模式。
设计模式【六】——装饰者模式组合模式外观模式第八章装饰者模式8.1 定义装饰者模式是指:动态的将新功能附加到对象上。
在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。
8.2 角色及职责•Component 主体:比如 Drink•ConcreteComponent:具体的主体,比如各个单品咖啡DeCaf, LongBlack 等•Decorator: 装饰者,比如各种调料 Milk, Soy 等•在Component 与ConcreteComponent 之间,如果ConcreteComponent 类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。
举例:装饰者模式就像打包一个快递•主体:如:陶瓷、衣服(Component)——被装饰者•包装:如:报纸填充、塑料泡沫、纸板、木板(Decorator)——装饰者8.3 在 JDK 中的应用jdk 的 io 体系中,使用了装饰者模式,FilterInputStream 就是一个装饰者。
•InputStream 是抽象类, 类似前面的 Drink•FileInputStream 是InputStream 子类,类似前面的DeCaf, LongBlack•FilterInputStream 是InputStream 子类,类似前面的Decorator 修饰者•DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等•FilterInputStream 类有 protected volatile InputStream in; 即含被装饰者——————————————————————————————————————第九章组合模式9.1 基本介绍1.组合模式(Composite Pattern)又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
设计模式之装饰模式(Decorator)详解及代码⽰例⼀、装饰模式的定义 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加⼀些职责(即增加其额外功能)的模式,它属于对象结构型模式。
⼆、装饰模式优缺点 装饰(Decorator)模式的主要优点有:采⽤装饰模式扩展对象的功能⽐采⽤继承⽅式更加灵活。
可以设计出多个不同的具体装饰类,创造出多个不同⾏为的组合。
其主要缺点是: 装饰模式增加了许多⼦类,如果过度使⽤会使程序变得很复杂。
三、装饰模式的实现 通常情况下,扩展⼀个类的功能会使⽤继承⽅式来实现。
但继承具有静态特征,耦合度⾼,并且随着扩展功能的增多,⼦类会很膨胀。
如果使⽤组合关系来创建⼀个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的⽬标。
下⾯来分析其基本结构和实现⽅法。
装饰模式主要包含以下⾓⾊。
抽象构件(Component)⾓⾊:定义⼀个抽象接⼝以规范准备接收附加责任的对象。
具体构件(Concrete Component)⾓⾊:实现抽象构件,通过装饰⾓⾊为其添加⼀些职责。
抽象装饰(Decorator)⾓⾊:继承抽象构件,并包含具体构件的实例,可以通过其⼦类扩展具体构件的功能。
具体装饰(ConcreteDecorator)⾓⾊:实现抽象装饰的相关⽅法,并给具体构件对象添加附加的责任。
装饰模式的结构图如图所⽰: 我们先来看看我们通过继承的⽅式新增特性这种实现⽅式,⽐如本例使⽤煎饼果⼦,代码如下:/*** 煎饼*/public class Battercake {protected String getDesc(){return "煎饼";}protected int cost(){return 8;}}/*** 加蛋的煎饼*/public class BattercakeWithEgg extends Battercake {@Overridepublic String getDesc() {return super.getDesc()+" 加⼀个鸡蛋";}@Overridepublic int cost() {return super.cost()+1;}}/*** 加蛋加⾹肠的煎饼*/public class BattercakeWithEggSausage extends BattercakeWithEgg {@Overridepublic String getDesc() {return super.getDesc()+ " 加⼀根⾹肠";}@Overridepublic int cost() {return super.cost()+2;}}public class Test {public static void main(String[] args) {Battercake battercake = new Battercake();System.out.println(battercake.getDesc()+" 销售价格:"+battercake.cost());Battercake battercakeWithEgg = new BattercakeWithEgg();System.out.println(battercakeWithEgg.getDesc()+" 销售价格:"+battercakeWithEgg.cost());Battercake battercakeWithEggSausage = new BattercakeWithEggSausage();System.out.println(battercakeWithEggSausage.getDesc()+" 销售价格:"+battercakeWithEggSausage.cost());}} 最后测试结果为:煎饼销售价格:8煎饼加⼀个鸡蛋销售价格:9煎饼加⼀个鸡蛋加⼀根⾹肠销售价格:11 虽然我们也实现了扩展类的功能,但是继承的⽅式耦合度⾼,并且如果新增会⽆限增加类,如果修改原有类,对后⾯的类影响很⼤,因此如果使⽤装饰模式,代码如下:public class DecoratorPattern{public static void main(String[] args){Component p=new ConcreteComponent();p.operation();System.out.println("---------------------------------");Component d=new ConcreteDecorator(p);d.operation();}}//抽象构件⾓⾊interface Component{public void operation();}//具体构件⾓⾊class ConcreteComponent implements Component{public ConcreteComponent(){System.out.println("创建具体构件⾓⾊");}public void operation(){System.out.println("调⽤具体构件⾓⾊的⽅法operation()");}}//抽象装饰⾓⾊class Decorator implements Component{private Component component;public Decorator(Component component){ponent=component;}public void operation(){component.operation();}}//具体装饰⾓⾊class ConcreteDecorator extends Decorator{public ConcreteDecorator(Component component){super(component);}public void operation(){super.operation();addedFunction();}public void addedFunction(){System.out.println("为具体构件⾓⾊增加额外的功能addedFunction()");}}四、装饰模式的应⽤场景 前⾯讲解了关于装饰模式的结构与特点,下⾯介绍其适⽤的应⽤场景,装饰模式通常在以下⼏种情况使⽤。
23种设计模式的经典运用介绍设计模式是解决软件设计中常见问题的可重复使用的解决方案。
本文将介绍23种经典的设计模式,并给出它们在实际开发中的应用示例。
通过学习这些设计模式,您将增加对软件设计的理解,并能够更好地解决问题。
创建型设计模式1.工厂方法模式(F a c t o r y M e t h o d)工厂方法模式通过定义一个创建对象的接口,但由子类决定实例化具体类。
这种方法可以延迟实例化过程,具有更高的灵活性和可扩展性。
应用场景:-在一个系统中,希望客户端与具体类的实例化解耦。
-希望通过增加具体类的扩展来增加系统的灵活性。
2.抽象工厂模式(A b s t r a c t F a c t o r y)抽象工厂模式提供一个接口,用于创建相关或依赖对象组。
这种模式将对象的实例化推迟到子类中,从而实现了解耦。
应用场景:-当一个系统独立于其产品的创建、组合和表示时。
-当需要一个系列的相互依赖的对象而无需指定其具体类时。
3.单例模式(S i n gl e t o n)单例模式确保一个类只有一个实例,并提供一个全局访问点。
这种模式常用于控制对资源的访问,例如数据库连接或日志文件。
应用场景:-当需要一个类的唯一实例,并且该实例需要被多个客户端共享时。
-当需要限制系统中特定类的实例数量时。
4.原型模式(P r o to t y p e)原型模式通过复制现有对象来创建新对象。
这种模式对于创建需要消耗大量资源的对象非常有用,可以通过克隆现有对象来提高性能。
应用场景:-当一个系统的某些对象的创建比较昂贵时。
-当需要避免构造函数调用,而直接通过复制现有对象来创建新对象时。
5.建造者模式(B ui l d e r)建造者模式将一个复杂对象的构建过程与其表现分离,使得相同的构建过程可以创建不同的表现。
应用场景:-当想要构建一些复杂对象时,如生成器。
-当需要创建对象的过程具有多个步骤,并且每个步骤都可以按需选择或省略时。
结构型设计模式6.适配器模式(A da p t e r)适配器模式将一个类的接口转换为客户端所期望的另一个接口。
设计模式-23种设计模式整体介绍及应⽤场景、七⼤设计原则总结对象的⼀、创建型模式:都是⽤来帮助我们创建对象的!(关注(关注对象的创建过程))创建过程模式1.单例单例模式保证⼀个类只有⼀个实例,并且提供⼀个访问该实例的全局访问点。
模式("Gof book"中把⼯⼚⽅法与抽象⼯⼚分为两种模式,所以创建型模式共为⼯⼚模式2.⼯⼚五种,这⾥只是为了⽅便整理,合在了⼯⼚模式中)-简单⼯⼚模式⽤来⽣产同⼀等级结构的任意产品。
(对于增加新的产品,需要修改已有代码)-⼯⼚⽅法模式⽤来⽣成同⼀等级结构中的固定产品。
(⽀持增加任意产品)-抽象⼯⼚模式⽤来⽣产不同产品族的全部产品。
(对于增加新的产品,⽆能为⼒,⽀持增加产品族)模式3.建造者建造者模式分离了对象⼦组件的单独构造(由Builder来负责)和装配(由Director负责),从⽽可以构造出复杂的对象。
模式原型模式4.原型通过new产⽣⼀个对象需要⾮常繁琐的数据准备或访问权限,则可以使⽤原型模式。
耦合,从⽽可以松耦合,从⽽可以扩⼤扩⼤结构上实现上实现松⼆、结构型模式:是从程序的、结构型模式:是从程序的结构对象和和类的组织)类的组织)(关注对象解决更⼤的问题。
(关注整体的类结构,⽤来整体的类结构,⽤来解决更⼤的问题。
模式1.适配器适配器模式⼯作中的场景:经常⽤来做旧系统改造和升级;如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的,但是不幸的是,事实却是维护⼀个系统的代价往往是开发⼀个系统的数倍。
学习中见过的场景:java.io.InputStreamReader(InputStream); java.io.OutpuStreamWriter(OutputStream)模式2.代理代理模式核⼼作⽤:通过代理,控制对对象的访问!可以详细控制访问某个(某类)对象的⽅法,在调⽤这个⽅法前做前置处理,调⽤这个⽅法后做后置处理。
(即:AOP的微观实现!)AOP(Aspect Oriented Programming⾯向切⾯编程)的核⼼实现机制!开发框架中应⽤场景:structs2中拦截器的实现;数据库连接池关闭处理;Hibernate中延时加载的实现;mybatis中实现拦截器插件;AspectJ的实现;spring中AOP的实现(⽇志拦截,声明式事务处理);web service;RMI远程⽅法调⽤模式桥接模式3.桥接实际开发中应⽤场景:JDBC驱动程序;AWT中的Peer架构;银⾏⽇志管理:格式分类:操作⽇志、交易⽇志、异常⽇志距离分类:本地记录⽇志、异地记录⽇志⼈⼒资源系统中的奖⾦计算模块:奖⾦分类:个⼈奖⾦、团体奖⾦、激励奖⾦。
设计模式空间结构设计模式是软件开发中经过多年实践总结出来的一套解决常见问题的方法论。
它们提供了一种可重用的设计方案,帮助开发人员解决各种复杂的问题。
在设计模式中,有一类特殊的设计模式被称为空间结构模式。
空间结构模式是一种用于处理空间关系的设计模式。
它们在处理对象之间的组合关系、层次结构和容器关系时非常有用。
空间结构模式可以帮助开发人员设计和实现具有灵活性和可扩展性的系统。
空间结构模式包括以下几种类型:1. 组合模式组合模式允许开发人员将对象组合成树形结构,然后通过统一的方式处理树中的所有对象。
这种模式使得开发人员可以将单个对象和组合对象一视同仁,从而简化了代码的复杂性。
2. 适配器模式适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。
它可以将不兼容的接口转换为兼容的接口,使得不同的类可以协同工作。
3. 装饰器模式装饰器模式允许开发人员在不改变原始对象的情况下,动态地向对象添加新的行为。
装饰器模式通过将对象包装在一个装饰器对象中,然后通过链式调用来添加额外的功能。
4. 外观模式外观模式提供了一个简化的接口,用于访问复杂子系统中的一组接口。
它隐藏了子系统的复杂性,使得客户端可以更加方便地使用子系统。
5. 享元模式享元模式用于减少系统中对象的数量,以节省内存和提高性能。
它通过共享具有相同状态的对象来实现这一目标。
6. 代理模式代理模式用于控制对对象的访问。
它可以在不改变原始对象的情况下,通过引入代理对象来控制对原始对象的访问。
这些空间结构模式在软件开发中发挥着重要的作用。
它们可以帮助开发人员减少代码的复杂性,提高系统的可维护性和可扩展性。
同时,它们也提供了一种清晰的设计思路,帮助开发人员更好地理解和组织系统的结构。
在实际应用中,开发人员需要根据具体的需求来选择合适的空间结构模式。
不同的模式适用于不同的场景,开发人员需要根据实际情况进行选择。
同时,开发人员还需要注意模式的正确使用,避免滥用模式导致系统设计过于复杂或性能下降的问题。
设计模式读书笔记-----组合模式我们对于这个图⽚肯定会⾮常熟悉,这两幅图⽚我们都可以看做是⼀个⽂件结构,对于这样的结构我们称之为树形结构。
在数据结构中我们了解到可以通过调⽤某个⽅法来遍历整个树,当我们找到某个叶⼦节点后,就可以对叶⼦节点进⾏相关的操作。
我们可以将这颗树理解成⼀个⼤的容器,容器⾥⾯包含很多的成员对象,这些成员对象即可是容器对象也可以是叶⼦对象。
但是由于容器对象和叶⼦对象在功能上⾯的区别,使得我们在使⽤的过程中必须要区分容器对象和叶⼦对象,但是这样就会给客户带来不必要的⿇烦,作为客户⽽已,它始终希望能够⼀致的对待容器对象和叶⼦对象。
这就是组合模式的设计动机:组合模式定义了如何将容器对象和叶⼦对象进⾏递归组合,使得客户在使⽤的过程中⽆须进⾏区分,可以对他们进⾏⼀致的处理。
⼀、模式定义组合模式组合多个对象形成树形结构以表⽰“整体-部分”的结构层次。
组合模式对单个对象(叶⼦对象)和组合对象(组合对象)具有⼀致性,它将对象组织到树结构中,可以⽤来描述整体与部分的关系。
同时它也模糊了简单元素(叶⼦对象)和复杂元素(容器对象)的概念,使得客户能够像处理简单元素⼀样来处理复杂元素,从⽽使客户程序能够与复杂元素的内部结构解耦。
上⾯的图展⽰了计算机的⽂件系统,⽂件系统由⽂件和⽬录组成,⽬录下⾯也可以包含⽂件或者⽬录,计算机的⽂件系统是⽤递归结构来进⾏组织的,对于这样的数据结构是⾮常适⽤使⽤组合模式的。
在使⽤组合模式中需要注意⼀点也是组合模式最关键的地⽅:叶⼦对象和组合对象实现相同的接⼝。
这就是组合模式能够将叶⼦节点和对象节点进⾏⼀致处理的原因。
⼆、模式结构组合模式主要包含如下⼏个⾓⾊:ponent :组合中的对象声明接⼝,在适当的情况下,实现所有类共有接⼝的默认⾏为。
声明⼀个接⼝⽤于访问和管理Component ⼦部件。
2.Leaf:叶⼦对象。
叶⼦结点没有⼦结点。
posite:容器对象,定义有枝节点⾏为,⽤来存储⼦部件,在Component接⼝中实现与⼦部件有关操作,如增加(add)和删除(remove)等。