zoukankan      html  css  js  c++  java
  • 10 浅谈 装饰器模式的理解与使用

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

    所属与结构型模式,

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

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

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

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

    开始:

    定义一个形状的接口

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

    具体的调用就可以了!

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

  • 相关阅读:
    C++动态链接库实践
    解决:linux eclipse 对‘dlopen’未定义的引用, 对‘xxx’未定义的引用
    bsd linux macosx solaris windows
    字节码加载执行原理
    JNI原理
    TODO: Java虚拟机 初始化过程
    mysql replaceinto VS insertinto
    centos7 搭建测试环境
    java 传值
    vue中使用sass 做减法计算
  • 原文地址:https://www.cnblogs.com/ChromeT/p/11689384.html
Copyright © 2011-2022 走看看