在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式
所属与结构型模式,
这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能。
为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀。
举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能)
实现:装饰类包含原有类的实例对象,即可实现装饰器模式
开始:
定义一个形状的接口
//画图接口 public interface Shape { void draw(); }
定义一个长方形的类去实现我们的形状接口,实现画出一个长方形的功能
public class Rectangle implements Shape { @Override public void draw() { System.out.println("画出长方形"); } }
定义一个圆形的类去实现我们形状,画出圆
public class Circle implements Shape { @Override public void draw() { System.out.println("画出一个圆形"); } }
//需要一个包装类,抽象类,并且实现被包装对象的接口
public abstract class Decorator implements Shape { protected Shape shape; public Decorator(Shape shape) { this.shape = shape; } @Override public void draw() { shape.draw(); } }
//具体的加入新功能的包装类实现类 继承这个包装抽象类
public class RedDecorator extends Decorator { public RedDecorator(Shape shape) { super(shape); } @Override public void draw() { super.draw(); //实现一个新的装饰 System.out.println("实现红色包装"); } }
//开始测试
public static void main(String[] args) { //红色长方形包装类 Shape rectangle = new RedDecorator(new Rectangle()); Shape circle = new RedDecorator(new Circle()); rectangle.draw(); circle.draw(); }
//然后,形象的截图表示一下,
浅谈:
学到这里,大致总结一下,原本的Shape(形状)接口只是用来画出具体的形状,比如圆形,长方形,没有具体的颜色这一功能。
就好比刚开始提到的,在不改变原有类结构的情况下,加入一项新的功能。我们在这个程序里面加入的是一项红色的包装这一功能。
具体的实现就是需要一个抽象包装类去实现原有功能的接口,然后引入一个具体的实例对象,并且使用实例的具体方法。比如draw();
具体相加如什么功能,就用具体的一个类去继承这个抽象类,因为这个抽象类本身已经实现了Shape 所以具体实现的 RedDecorator本身也就是一个Shape的一个实例。
具体的调用就可以了!
暂时的理解就这么多,还是得需要多研究 ,欢迎批评指正!
原文地址:https://www.cnblogs.com/ChromeT/p/11689384.html
时间: 2024-11-06 22:15:29