Java设计模式——针对可维护性的设计模式(11种)

写在前面:阅读设计模式的时候或许会觉得许多设计模式都不过是多此一举,但如果站在自己是类库开发者为用户服务的角度想问题,将自己想象成用户,将自己置身于多人程序开发的场景,就能理解设计模式的好处了。

1.构建模式
(1)工厂模式(Factory)

目的:
方法:创建Factory接口/抽象类,用户通过为Factory赋予不同的实现使不同的Factory返回不同的对象。
构造方式:

	|用户| <—— |<Interface> Target|   |原类|
						| 实现			| 继承或委托
						————|Adapter|————

其他:类似Adapter。

(2)抽象工厂模式(AbstractFactory)

目的:
方法:创建一个AbstractFactory的接口/抽象类,用户通过为AbstractFactory赋予不同的实现使不同的AbstractFactory返回不同且配套的工厂

|<Interface> Pizza|————————————
		| 实现					| 继承
|ConcretePizza| |<Abstract> Decorator|Pizza pizza|construct(pizza) add()|
							|
				  |TopA|——————————|TopB|

其他:类似Decorator。

(3)构建者模式(Builder)

目的:
方法:创建一个Director类与用户对接,创建一个Builder接口,用户通过向Director动态传入Builder的不同实现,让Director帮助用户调用Buider中的方法并返回对象。Builder接口规定了构建对应一类复杂对象的各阶段过程,由其实现完成各阶段具体算法的填充。
构造方式:

|用户|——>|Facade|
			|
|@$%^#|-|^&*^&|-|%%$&^|

其他:类似Template。

2.结构化模式
(1)桥接模式(Bridge)

目的:将抽象概念间的关联与具体实现间的关联分离,避免过于复杂的继承结构。
方法:假设已有一个继承关系复杂的抽象接口。之所以说继承关系复杂是因为其需要同时适应多种无关属性的变化,如形状、颜色等。这时就可以将颜色相关的属性抽象为新接口与原有对象组合起来,完成桥接。
创建一个可分解的复杂概念接口,对概念的各组成部分分别创建接口,作为复杂概念的属性。不同的小概念分别有自己的继承树,通过组合完成复杂概念的复杂继承。
构造方式:

	|Context|func(Strategty strategy)| <—— |<Interface> Strategty|
													  |
				  					  |StrategtyA|——————————|StrategtyB|

其他:

(2)代理模式(Proxy)

目的:
方法:创建一个被代理对象的接口,创建其正常实现,创建Proxy类也作为接口的实现。在Proxy中存储一个接口的具体实现。通过延迟加载的方式可实现虚拟代理。
构造方式:

|用户|——>|<Abstract> Template|
				    |
     |TemplateA|——————————|TemplateB|

其他:代理模式有三种情况:(1)远程代理——适合对象属性很少变化的情况(2)虚拟代理——适合创建对象开销很大的情况(3)保护代理——适合不同用户对对象有不同访问权限的情况。

(3)合成模式(Composite)

目的:
方法:创建一个组件接口/抽象类,创建接口的一个叶子实现,创建一个Compsite类也作为其实现。Composite类中可存储叶子对象或Composite对象。完成递归式的调用、访问等功能。
构造方式:

|<Iterable> Aggregate|<——|用户|——>|     <Interface> Iterator      |
|   getIterator()    |			  |next() hasNext() currentItem() |
	   	   |						   			   | 
 |ConcreteAggregate|<————————————————————>|ConcreteIterator|

其他:

3.行为化模式
(1)观察者模式(Observer)(其实叫订阅者模式或许更贴切)

目的:
方法:
创建一个Subject抽象类,其中定义notify()方法,给予其ConcreteSubject类实现。
创建一个Observer接口,其中定义update()方法,给予其ConcreteObserver类实现。Subject中保存订阅者(Observer)的列表,并提供注册和注销两种方法。在调用notify()改变自身状态后,同时调用所有订阅者的update()函数。
Observer中的update()可以拉取主体的状态,也可以将每一次外部调用作为信号来更新自己的属性。也可以直接让Subject将Observer关心的属性送到Observer中。
构造方式:

	|Context|func(Strategty strategy)| <—— |<Interface> Strategty|
													  |
				  					  |StrategtyA|——————————|StrategtyB|

其他:通知机制。

(2)中介模式(Mediator)

目的:
方法:
创建一个Mediator接口,其中规定send()和注册、注销方法。
创建一个People抽象类,其中存储Mediator,定义发送和接受方法、定义返回对应中介的方法。
在People的实现中,发送即调用Mediator的send()方法,将People想要传递的信息和People自身的表示发送给Mediator。接受方法即得到一定的信息,People可自行处理。
在Mediator的实现中维护一个订阅者列表,当Peolple调用send()方法时,将该信息发送给列表中调用除发送者外所有人的接受方法。
构造方式:

|用户|——>|<Abstract> Template|
				    |
     |TemplateA|——————————|TemplateB|

其他:

(3)参观者模式(Visitor)(叫委托模式或许更恰当)

目的:将数据结构与其上的处理分离(给Visitor),当逻辑发生变化时只需修改Visitor的实现。
方法:核心是重载。
创建一个Element接口,其中有Element希望完成的功能。
创建一个Visitor接口,其中有适应Element希望完成的功能的各种实现。
在Element的实现中,在功能函数里传入Visitor的实现,内部直接用Visitor中的实现方法,将Element自己传入Visitor中(委托)。
在Visitor的实现中,根据传入的Element不同,完成对应的功能实现。
构造方式:

|<Iterable> Aggregate|<——|用户|——>|     <Interface> Iterator      |
|   getIterator()    |			  |next() hasNext() currentItem() |
	   	   |						   			   | 
 |ConcreteAggregate|<————————————————————>|ConcreteIterator|

其他:

(4)状态模式(State)

目的:
方法:
构造方式:

|用户|——>|<Abstract> Template|
				    |
     |TemplateA|——————————|TemplateB|

其他:

(5)备忘录模式(Memento)

目的:
方法:
创建一个要管理的数据结构ADT,其中保有ADT的各种状态state。
创建一个Memento类,其中也保存着ADT的state。Memento中有getState()和setState()方法便于ADT进行状态保存和恢复。
创建一个CareTaker类,为了保证ADT的表示不会泄露。CareTaker存储一系列备忘录。CareTaker包含getMemento()和setMemento()方法。getMemento()即将存入的备忘录存储起来。setMemento()即将第i号备忘录返回给用户。
在ADT中加入setByMemento()和createNewMemento()方法。createNewMemento()即当ADT希望保存当前状态时,返回一个备忘录。setByMemento()即当传入备忘录时,ADT根据备忘录中的内容恢复为备忘录上记载的状态。
构造方式:

|<Iterable> Aggregate|<——|用户|——>|     <Interface> Iterator      |
|   getIterator()    |			  |next() hasNext() currentItem() |
	   	   |						   			   | 
 |ConcreteAggregate|<————————————————————>|ConcreteIterator|

其他:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值