装饰者模式,是谁装饰了谁?
2022-03-16 本文已影响0人
程就人生
说到装饰者模式,你想到了什么?
是谁装饰了谁?
谁是被装饰者,谁是装饰者?
它们之间是如何建立装饰关系的?
图片装饰者模式(decorator pattern)允许向一个现有的对象添加新的功能,同时又不影响现有代码,不会改变现有结构。它是一种结构型模式,是继承模式的一个替代模式。
业务使用场景:动态扩展、撤销一个类的功能,同时又不影响现有的类。
关键代码:装饰抽象类继承现有组件类并依赖现有组件类,装饰继承类重写父类方法,对现有组件类进行装饰。
下面看UML类图关系: 图片代码实现步骤:1.形状接口,被装饰类;
/**
* 1.形状接口
* @author 程就人生
* @Date
*/
public interface IShape {
void draw();
}
2.形状接口实现类,圆形和矩形,还可以有更多;
/**
* 2.形状的实现类,圆形
* @author 程就人生
* @Date
*/
public class Circle implements IShape {
@Override
public void draw() {
System.out.println("draw shape: circle");
}
}
/**
* 2.形状的实现类,矩形
* @author 程就人生
* @Date
*/
public class Rectangle implements IShape{
@Override
public void draw() {
System.out.println("draw shape: rectangle");
}
}
3.关键代码来了,抽象装饰类实现了现有类形状接口;
/**
* 3.抽象装饰类,实现了现有接口IShape
* @author 程就人生
* @Date
*/
public class AbstractDecorator implements IShape{
// 被装饰者
protected IShape decoratedShape;
public AbstractDecorator(IShape decoratedShape) {
this.decoratedShape = decoratedShape;
}
@Override
public void draw(){
decoratedShape.draw();
}
}
4.抽象装饰类的继承者(一个或多个),重写父类的方法;
/**
* 4.装饰抽象类的实现者
* @author 程就人生
* @Date
*/
public class RedShapeDecorator extends AbstractDecorator{
public RedShapeDecorator(IShape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw(){
decoratedShape.draw();
System.out.println("fill color: red");
}
}
5.测试代码;
public static void main(String[] argo){
//被装饰者
IShape circle = new Circle();
//无装饰的输出
System.out.println("无装饰者输出:");
circle.draw();
//装饰者
AbstractDecorator redCircleDecorator = new RedShapeDecorator(circle);
//被装饰过的输出
System.out.println("被装饰过输出:");
redCircleDecorator.draw();
}
测试结果:
无装饰者输出:
draw shape: circle
被装饰过输出:
draw shape: circle
fill color: red
这段代码的意思是:现有形状接口,和实现该接口的圆形、矩形,想要给形状填充颜色,还不想改变这几个类。于是,增加了抽象装饰类,和抽象装饰类的继承者---红色填充装饰类。使用装饰类来对形状进行颜色的填充,这样就达到了不改变现有代码又可以达到填充颜色的效果。
最后总结
装饰者模式也是经常用到的模式,一般源码的类名中含有decorator的,都是装饰者模式,或者装饰者模式和其他模式的组合。 看网上示例无数,不如自己动手码一遍来得印象深刻,还等什么,赶紧试一试吧!