目录
- 一、背景介绍
- 二、思路&方案
- 三、过程
- 1.装饰模式简介
- 2.装饰模式的类图
- 3.装饰模式代码
- 4.装饰模式,职责父类拆分的奥义
- 5.装饰模式,部件抽象类的无中生有
- 四、总结
- 五、升华
一、背景介绍
最近公司在做架构模型的时候,涉及到装饰模式的研究,对于装饰模式的边界理解,本次有了看山还是山的效果,故做此总结以记录本次的升华。
二、思路&方案
- 1.装饰模式简介
- 2.装饰模式的类图
- 3.装饰模式代码
- 4.装饰模式,职责父类拆分的奥义
- 5.装饰模式,部件抽象类的无中生有
三、过程
1.装饰模式简介
装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
解释:给(ConcreteComponent)对象增加一些额外(Decorator的子类)职责;就给(ConcreteComponent)增加功能来说;通过生成(ConcreteComponent)子类的方式增加功能;装饰模式更为灵活(扩展装饰子类通过聚合方式装饰,耦合性更低)
2.装饰模式的类图
3.装饰模式代码
package com.a7DesignPattern.a2StructuralType.a04Decorator;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 14:43
*/
public class Client {
public static void main(String[] args) {
ConcreteComponent c = new ConcreteComponent();
ConcreteComponentA a = new ConcreteComponentA();
ConcreteComponentB b = new ConcreteComponentB();
a.setComponent(c);
b.setComponent(a);
b.Operation();
}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 11:30
*/
public abstract class Component {
public abstract void Operation();
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 11:37
*/
public class ConcreteComponent extends Component{
@Override
public void Operation() {
System.out.println("具体对象的操作");
}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 11:43
*/
public class Decorator extends Component{
protected Component component;
@Override
public void Operation() {
if(component != null){
component.Operation();
}
}
public void setComponent(Component component) {
this.component = component;
}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 14:27
*/
public class ConcreteComponentA extends Decorator{
private String addedState;
@Override
public void Operation() {
super.Operation();
addedState = "New State";
System.out.println("具体装饰对象A");
}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;
import com.a6UMLRelationShip.a3combination.a2.A;
/**
* 功能描述:
*
* @Author:makang
* @Date: 2021/5/19 14:29
*/
public class ConcreteComponentB extends Decorator{
@Override
public void Operation() {
super.Operation();
AddedBehavior();
System.out.println("具体装饰对象B");
}
private void AddedBehavior(){
}
}
4.装饰模式,职责父类拆分的奥义
Decorator类是从ConcreteComponent中的装饰行为中抽象出来的类;从而使得后续扩展装饰符合开闭原则。
5.装饰模式,部件抽象类的无中生有
ConcreteComponent中的装饰行为的拆分,使得这些行为与被装饰者必须得从客户端产生关系;这也就对客户端暴露了业务;因而产生Component类。
四、总结
- 1.无装饰模式情况下,将装饰方式当做被装饰者类中行为;这些行为对于被装饰者类而言不支持开闭原则。
- 2.装饰行为在被装饰者中剥离之后,使得两个如何合并成为了眼前的问题。
- 3.无中生有的做一个部件抽象类,又将两者做了部件类上的合并。
- 4.技术上可以实现,业务上没有实现;这样的一种实现结果是否算是符合要求的? 将这条透明化的问题提出来也是进步的印证。
五、升华
该模式从技术角度通过剥离+无中生有父类的角度实现了扩展装饰符合开闭原则,并且对于客户端也没有对外暴露装饰过程的效果;在业务的角度是需要站到技术的基础之上去理解业务才会更加顺畅。