湖南建设厅官方网站,怎样做百度网站,wordpress 论坛插件,做思维导图好看的网站结构型设计模式 文章目录 结构型设计模式一、概述二、适配器模式#xff08;Adapter Pattern#xff09;2.1 类适配器模式2.2 对象适配器模式2.3 接口适配器模式2.4 小结 三、桥接模式#xff08;Bridge Pattern#xff09;四、装饰器模式#xff08;Decorator PatternAdapter Pattern2.1 类适配器模式2.2 对象适配器模式2.3 接口适配器模式2.4 小结 三、桥接模式Bridge Pattern四、装饰器模式Decorator Pattern五、组合模式Composite Pattern六、外观模式Facade Pattern七、享元模式Flyweight Pattern八、代理模式Proxy Pattern九、依赖注入模式 *Dependency Injection十、流接口模式 *Fluent Interface 一、概述
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
适配器模式Adapter Pattern桥接模式Bridge Pattern装饰器模式Decorator Pattern组合模式Composite Pattern外观模式Facade Pattern享元模式Flyweight Pattern代理模式Proxy Pattern依赖注入模式 *Dependency Injection流接口模式 *Fluent Interface
二、适配器模式Adapter Pattern
适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示主的目的是兼容性让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)主要分为三类类适配器模式、对象适配器模式、接口适配器模式
2.1 类适配器模式
Adapter类通过继承 src类实现 dst 类接口完成src-dst的适配。
以手机充电器为例子 充电器本身相当于Adapter220V交流电相当于src (即被适配者)dst(即目标)是5V直流电
2.2 对象适配器模式
基本思路和类的适配器模式相同只是将Adapter类作修改不是继承src类而是持有src类的实例以解决兼容性的问题。 即持有 src类实现 dst 类接口完成src-dst的适配根据“合成复用原则”在系统中尽量使用关联关系来替代继承关系对象适配器模式是适配器模式常用的一种
public class VoltageAdapter2 implements Voltage5 {private Voltage220 voltage220; //持有Voltage220对象,不是继承了
}2.3 接口适配器模式
当不需要全部实现接口提供的方法时可先设计一个抽象类实现接口并为该接口中每个方法提供一个默认实现空方法那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。在使用Java做页面监听时经常会碰到对应适配类。
2.4 小结
三种命名方式是根据 src是以怎样的形式给到Adapter在Adapter里的形式来命名的。 类适配器以类给到在Adapter里就是将src当做类继承对象适配器以对象给到在Adapter里将src作为一个对象持有接口适配器以接口给到在Adapter里将src作为一个接口实现 Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。实际开发中实现起来不拘泥于这三种经典形式
三、桥接模式Bridge Pattern
桥接模式(Bridge 模式)是指是将抽象部分与它的具体实现部分分离使它们都可以独立地变化。Bridge 模式基于类的最小设计原则通过组合/聚合的方式建立两个类之间的联系而不是继承。但又类似于多重继承方案但是多重继承方案往往违背了类的单一职责原则其复用性较差桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。 Client 类桥接模式的调用者抽象类(Abstraction) :维护了 Implementor / 即它的实现类 ConcreteImplementorA…, 二者是聚合关系, Abstraction充当桥接类RefinedAbstraction : 是 Abstraction 抽象类的子类Implementor : 行为实现类的接口ConcreteImplementorA /B 行为的具体实现类从 UML 图这里的抽象类和接口是聚合的关系其实是调用和被调用关系
上面概念比较抽象这里以手机为例
首先有需求手机可以按品牌分HuaWei、Vivo、XiaoMi不同品牌对应着不同的应用商城业务需求变更对于手机型号有了区分分为A、B、C型不按桥接模式设计则需要多重继承实现功能全排序不同品牌对应不同型号共9个实现按桥接模式设计新建一个桥接抽象类为Phone其实现类分别为A、B、C型有不同的功能通过聚合关系将品牌实现接口聚合到Phone抽象类中这样只需新增3个实现类而手机的型号以及品牌又可以区分开来分别运用其不同特别功能
常见应用场景
JDBC 驱动程序银行转账系统 转账分类: 网上转账柜台转账AMT 转账转账用户类型普通用户银卡用户金卡用户 消息管理 消息类型即时消息延时消息消息分类手机短信邮件消息QQ 消息…
四、装饰器模式Decorator Pattern
装饰器模式Decorator Pattern允许向一个现有的对象添加新的功能同时又不改变其结构。
典型的应用就是jdk中IO流的应用FilterInputStream 就是一个装饰者BufferInputStream是具体的实现类通过组合的关系使得输入流有了缓冲的功能而又无需修改原有inputStream代码。 五、组合模式Composite Pattern
组合模式就运用了树形结构该模式的核心思想是将多个对象组合成树形结构以此结构来表示“整体-部分”之间的层次关系。 抽象根节点Component定义系统各层次对象的共有方法和属性可以预先定义一些默认行为和属性树枝节点Composite定义树枝节点的行为存储子节点组合树枝节点和叶子节点形成一 个树形结构叶子节点Leaf叶子节点对象其下再无分支是系统层次遍历的最小单位
应用场景
组合-部分整体场景将多个对象组合成一个整体并且整体与部分是一致对待的。比如树形菜单、文件夹和文件等递归结构场景处理递归的数据结构。比如文件和目录的关系就是递归的规则场景当需要处理的对象具有明显的层次结构时可以考虑使用组合模式。比如企业中不同职位的员工每个职位的员工都有一些共同的属性比如姓名、公司邮件地址但也有一些不同的属性比如职位、薪水等任务分解场景将一个大任务分解为多个小任务然后再将小任务组合起来形成一个任务树。这种情况下可使用组合模式对任务进行建模GUI控件场景GUI控件通常可以嵌套在其他控件中并且用户可以在控件中插入其他控件组合模式适用于GUI控件的场景
组合模式适用于处理树形结构的场景将一个对象的部分和整体看作一样形成一个树形结构。在需要统一处理整个树形结构时可以考虑使用组合模式。
六、外观模式Facade Pattern
外观模式Facade也叫过程模式外观模式为子系统中的一组接口提供一个一致的界面此模式定义了一个高层接口。
外观模式通过定义一个一致的接口用以屏蔽内部子系统的细节使得调用端只需跟这个接口发生调用而无需关心这个子系统的内部细节。这个模式我们平时就会使用比如调用交易接口交易接口中会再去调用其他各个接口。或者MVC模式下我们写的Controller即对外暴露接口前端开发无需关心后端干了什么。 通过合理的使用外观模式可以帮我们更好的划分访问的层次在维护一个遗留的大型系统时可能这个系统已经变得非常难以维护和扩展此时可以考虑为新系统开发一个 Facade 类来提供遗留系统的比较清晰简单的接口让新系统与 Facade 类交互提高复用性不能过多的或者不合理的使用外观模式使用外观模式好还是直接调用模块好。要以让系统有层次利于维护为目的
七、享元模式Flyweight Pattern
享元模式Flyweight Pattern 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象。
享元模式经典的应用场景就是池技术了String 常量池、数据库连接池、缓冲池等等都是享元模式的应用享元模式是池技术的重要实现方式 FlyWeight 是抽象的享元角色, 他是产品的抽象类, 同时定义出对象的外部状态和内部状态(后面介绍) 的接口或实现ConcreteFlyWeight 是具体的享元角色是具体的产品类实现抽象角色定义相关业务UnSharedConcreteFlyWeight 是不可共享的角色一般不会出现在享元工厂FlyWeightFactory 享元工厂类用于构建一个池容器(集合) 同时提供从池中获取对象方法这个一般被设计为单例模式
内部状态是不会变化的可以被多个对象共享而外部状态会随着对象的使用而改变。比如连接池中的连接对象保存在连接对象中的用户名、密码、连接URL等信息在创建对象的时候就设置好了不会随环境的改变而改变这些为内部状态。而当每个连接要被回收利用时我们需要将它标记为可用状态这些为外部状态。
八、代理模式Proxy Pattern
代理模式为一个对象提供一个替身以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存动态的创建对象而不需要实现接口 他是属于动态代理的范畴)。最经典的运用即Spring的AOP。
九、依赖注入模式 *Dependency Injection
依赖注入Dependency Injection是控制反转Inversion of Control的一种实现方式。
我们先来看看什么是控制反转。当调用者需要被调用者的协助时在传统的程序设计过程中通常由调用者来创建被调用者的实例但在这里创建被调用者的工作不再由调用者来完成而是将被调用者的创建移到调用者的外部从而反转被调用者的创建消除了调用者对被调用者创建的控制因此称为控制反转。
要实现控制反转通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成然后在调用者中注入被调用者通过构造器/方法注入实现这样就实现了调用者与被调用者的解耦该过程被称为依赖注入。依赖注入不是目的它是一系列工具和手段最终的目的是帮助开发出松散耦合loose coupled、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口或者说是面向抽象编程。典型应用案例即Spring中使用Autowize 注解实现属性注入。
个人感觉这种模式和注册模式类似都是通过统一容器收纳注册对象调用方直接通过注册容器调用接口具体实现类则由容器返回。故不再对注册模式分析。
十、流接口模式 *Fluent Interface
在软件工程中流接口Fluent Interface是指实现一种面向对象的、能提高代码可读性的 API 的方法其目的就是可以编写具有自然语言一样可读性的代码我们对这种代码编写方式还有一个通俗的称呼 —— 方法链。
最常见的就是Lombak注解中Builder 或者 Accessors(chaintrue) 开启链式编程即可通过方法链调用的方式设置实体类的属性。
// 用简洁的方式实例化实体类并完成赋值操作而无需多行不断调用set方法
XUser xUser XUser.builder().userId(1).userName(AAAAA).build();