【设计模式】结构型模式
写在前面 |
我们已经知道,设计模式有23种:
设计模式类型 | 包括 |
---|---|
创建型模式 (5种) | 单例模式、抽象工厂模式、建造者模式、工厂方法模式、原型模式 |
结构型模式(7种) | 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 |
行为型模式 (11种) | 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式、访问者模式 |
接下来对结构型模式进行一个详细的介绍和说明
适配器模式: |
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作
优点:
1,将目标类与适配者类解耦:就像自己的笔记本和电源之间一样,适配器充电器的作用使得只要有电源就可以使用笔记本,而不会固定在一个地方
2,增加类的复用性:同一个适配器类可以在多个不同的系统中复用。
3,灵活性和扩展性较好:就像手机充电器一样,你没有,借一借别人的就可以给自己的手机充电
缺点:
1,不能适配多个适配者
2,目标抽象类只能为接口,不能为类
桥接模式: |
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
优点:
1,分离抽象接口及其实现部分
2,提高了系统的可扩展性
缺点:
桥接模式的使用会增加系统的理解与设计难度
装饰模式: |
动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。
优点:
1, 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。
2,可以通过一种动态的方式来扩展一个对象的功能,从而实现不同的行为。
3, 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。
4,具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则”。
缺点:
1,使用装饰模式进行系统设计时将产生很多小对象,在一定程序上影响程序的性能。
2, 装饰模式提供了一种比继承更加灵活机动的解决方案,但同时也意味着比继承更加易于出错,排错也很困难,较为繁琐。
组合模式: |
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构
优点:
1,组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2,客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
3,在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
4,组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点:
在增加新构件时,很难对容器中的构件类型进行限制。
外观模式: |
为子系统中的一组接口提供一个统一的入口,这个接口使得这一子系统更加容易使用。它是迪米特法则的一种具体实现
优点:
1,对客户端屏蔽了子系统组件,使得客户端代码变得很简单。
2,子系统发生变化时,不会影响到调用它的客户端,只需调整外观类即可
3,一个子系统的修改,对其他子系统没有任何影响,而且子系统内部变化也不会产生影响
缺点:
1,不能很好地限制客户端直接使用子系统类
2,如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了“开放-封闭”原则
享元模式: |
运用共享技术有效地支持大量细粒度对象的复用
优点:
1,可以减少内存中对象的数量,从而节约系统资源,提高系统性能
2,享元模式的外部状态相对独立,而且不会影响内部状态,从而使得享元对象可以在不同环境中被共享
缺点:
使得系统变得复杂,因为需要分离出内部状态和外部状态
代理模式: |
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问
优点:
1,协调调用者和被调用者,在一定程度上降低系统的耦合度
2,可以针对抽象主题角色进行编程,增加和更换代理类的时候不需要修改源代码
缺点:
1,因为在客户端和对象之间增加了代理,所以可能会造成请求的处理速度变慢
2,实现代理模式需要额外的工作
总结
到这里只是进行了一个简单的了解,在以后的过程中,还会再学习。
感谢您的阅读~~