码迷,mamicode.com
首页 > 其他好文 > 详细

10 浅谈 装饰器模式的理解与使用

时间:2019-10-17 01:07:06      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:stat   print   并且   code   cte   例子   抽象   protected   实现类   

在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式

所属与结构型模式,

这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能。

 

为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀。

举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能)

 

实现:装饰类包含原有类的实例对象,即可实现装饰器模式

 

开始:

定义一个形状的接口

//画图接口
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的一个实例。

 

具体的调用就可以了!

 

暂时的理解就这么多,还是得需要多研究 ,欢迎批评指正!

10 浅谈 装饰器模式的理解与使用

标签:stat   print   并且   code   cte   例子   抽象   protected   实现类   

原文地址:https://www.cnblogs.com/ChromeT/p/11689384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!