结构型设计模式
三:总结提升
一:结构型概念
顺口溜:石桥组装外乡带
结构型设计模式一共有7个分别是:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
结构型模式描述怎么样将类或者对象按照某种布局组成更大的结构。
分为类结构模式和对象结构模式
第一种使用继承来组织接口和类
第二种使用组合、聚合的方式将对象进行组合。
二:各个模式分析
2.1 类结构模式
2.1.1 适配器模式2.1.1.1基本概念
将一个类的接口适配成用户所期待的。一个适配允许因为接口不兼容而不能在一起工作的类在一起工作。具体的做法是将类自己的接口包裹在一个已存在的类中。
适配器的核心有三部分。
用户期待的接口
用来包装的类
被包装的类(需要适配的类)
2.1.1.2 类图
2.1.1.3 代码
namespace 适配器模式 { internal class Program { static void Main(string[] args) { //声明的是客户端所期待的接口 Target target = new Adepter(); //这里是通过适配类调用的被适配类的方法 target.Request(); } } //需要进行适配的类 class Adeptee { public void SpecificRequest() { Console.WriteLine("这里是一个特殊的,需要适配的方法。"); } } //客户期待的接口 interface Target { void Request(); } //适配器类,用来包装需要被适配的类 class Adepter : Target { //一个私有的被适配的类的实例 private Adeptee adeptee = new Adeptee(); //在适配器里具体的调用的是被包装的类的对象的方法 public void Request() { adeptee.SpecificRequest(); } } }
2.1.2 装饰模式
2.1.2.1 概念
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
使用装饰模式,将每个要装饰的功能放在单独类中,并让这个类包装它所要装饰的对象。
2.1.2.2 类图2.1.2.3 代码实现
//定义一个对象接口,可以给这些对象动态的添加职责 abstract class Component { public abstract void Operation(); } //定义了一个具体的对象,也可以给这个对象添加一些职责 class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("具体对象的操作!"); } } //装饰抽象类,继承Component类,从外类扩展Component类功能 abstract class Decorator : Component { protected Component component; //设置Component的方法 public void SetComponent(Component component) { this.component = component; } //重写Operation方法 public override void Operation() { if (component != null) { component.Operation(); } } } //具体的装饰对象A,起到给Component添加职责的功能 class ConcreteDecoratorA : Decorator { private string addState; //本类独有功能 public override void Operation() { base.Operation(); addState = "new State"; Console.WriteLine("具体装饰对象A的操作"); } } //具体的装饰对象B,起到给Component添加职责的功能 class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); AddedBehavior(); //本类独有的方法 Console.WriteLine("具体装饰对象A的操作"); } private void AddedBehavior() { } }
2.1.3 代理模式
2.1.3.1 概念
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2.1.3.2 类图2.1.3.3 代码
internal class Program { static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); //调用的实际的请求 } } //抽象的接口 abstract class Subject { public abstract void Request(); } //真实请求 class RealSubject : Subject { public override void Request() { Console.WriteLine("真实的请求"); } } //代理类 class Proxy : Subject { RealSubject realSubject; public override void Request() { if (realSubject == null) { realSubject = new RealSubject(); } realSubject.Request(); } }
2.2 对象结构模式
2.2.1 桥接模式
2.2.1.1 概念
桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要作用是将抽象部分和实现部分分离开来,使它们可以独立地变化。
桥接模式的核心思想是使用“桥”来连接抽象部分和实现部分,让它们可以独立地变化。桥接模式通过将一个大类或者一系列紧密关联的类拆分成抽象和实现两个独立的层次结构,从而使它们可以独立地进行扩展和变化,而不会相互影响。
在桥接模式中,抽象部分和实现部分通过抽象类或者接口来进行连接。抽象部分定义了抽象接口,而实现部分则实现了这些接口。通过将- 抽象部分和实现部分分离开来,桥接模式可以让它们各自独立地进行扩展和变化。
桥接模式的优点包括:
分离抽象和实现,使得扩展变得容易;
使得抽象部分和实现部分可以独立地进行变化,从而提高了系统的灵活性和可维护性;
消除了多重继承的缺点,避免了类层次结构的爆炸。
桥接模式的缺点包括:
增加了系统的复杂度,需要增加抽象类或接口等额外的类和接口;
对于简单的系统来说,使用桥接模式可能会显得过于复杂。
2.2.1.2 类图2.2.1.3 代码实现
2.2.2 组合模式
2.2.2.1 概念
组合模式(Composite Pattern)是一种结构型设计模式,它的主要作用是将对象组合成树形结构来表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和对象组合。
组合模式中,有两种基本的对象类型:叶子节点(Leaf)和容器节点(Composite)。叶子节点表示对象的基本元素,而容器节点则包含多个子节点,可以是叶子节点或其他容器节点。容器节点可以递归地组合子节点,从而形成树形结构。
组合模式的核心思想是将叶子节点和容器节点抽象为同一个接口,使得客户端可以统一地对待它们。客户端不需要知道对象是叶子节点还是容器节点,可以直接调用接口中的方法来操作它们。
组合模式的优点包括:
可以使客户端统一地处理单个对象和对象组合,使得代码更加简洁和易于维护;
可以通过递归遍历来处理复杂的树形结构,使得代码更加灵活和可扩展;
可以提高系统的扩展性,可以通过添加新的叶子节点或容器节点来扩展系统的功能。
组合模式的缺点包括:
在某些情况下,可能会导致系统的设计变得过于抽象化,使得代码难以理解和维护;
在组合结构比较复杂的情况下,可能会影响系统的性能。
2.2.2.2 类图2.2.2.3 代码实现
2.2.3 外观模式
2.2.3.1 概念
外观模式,通过为多个复杂的子系统提供一个一致的接口,使得这些子系统更容易被访问。外部不用关心内部系统的细节,只是使用这个统一的接口就足够了
2.2.3.2 类图2.2.3.2 代码
class Facade { //聚合子类对象 private Subsystem1 subsystem1 = new Subsystem1(); private Subsystem2 subsystem2 = new Subsystem2(); private Subsystem3 subsystem3 = new Subsystem3(); //在这里可以调用子类具体的方法 public void Method() { subsystem1.Subsystem1Method(); subsystem2.Subsystem1Method(); subsystem3.Subsystem1Method(); } } class Subsystem1 { public void Subsystem1Method() { Console.WriteLine("第一个类的方法"); } } class Subsystem2 { public void Subsystem1Method() { Console.WriteLine("第二个类的方法"); } } class Subsystem3 { public void Subsystem1Method() { Console.WriteLine("第三个类的方法"); } }
外观模式主要有三个部分构成。分别是
外观角色:为多个子系统提供对外接口
子系统:系统的部分功能
客户:使用外观角色访问子系统功能。
2.2.4 享元模式
2.2.4.1 概念
使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
2.2.4.2 类图
2.2.4.3 代码
internal interface IFlyweight { void Operation(int extrinsicstate); } //具体享元类 class ConcreteFlyweight : IFlyweight { //实现享元类的接口,为内部状态增加存储空间 public void Operation(int extrinsicstate) { Console.WriteLine("具体Flyweight" + extrinsicstate); } } //实现享元接口,但并不共享,因为Flyweight不强制共享 class UnsharedConcreteFlywight : IFlyweight { public void Operation(int extrinsicstate) { Console.WriteLine("不共享的Flyweight:" + extrinsicstate); } } //享元工厂,用来创建和管理Flyweight对象。当用户进行请求时、此类负责 //提供一个已创建的实例或者创建一个 class FlyweightFactory { //使用hashTable拉力保存对象 private Hashtable flyweights = new Hashtable(); //初始化添加三个实例 public FlyweightFactory() { flyweights.Add("X", new ConcreteFlyweight()); flyweights.Add("Y", new ConcreteFlyweight()); flyweights.Add("Z", new ConcreteFlyweight()); } //根据客户端请求,获得产生的实例 public IFlyweight GetFlyweight(string key) { return ((IFlyweight)flyweights[key]); }
使用享元模式可以大大降低创建重复对象占用的空间
三:总结提升
本文简要介绍了结构型设计模式,包括类结构和对象结构,以及桥接模式和组合模式的概念和作用。学习结构型设计模式能够帮助开发人员更加灵活、高效地构建系统,并且提高系统的可扩展性和可维护性。在应用结构型设计模式时,需要根据实际情况选择适当的模式,遵循最佳实践,从而编写出高质量的代码。