zoukankan      html  css  js  c++  java
  • JDK设计模式之——装饰者模式

    • 假定已经有三个类A,B和C他们的继承关系如下
                                 ClassA
    Class B extends A  Class C extends A 

        想进一步扩展类B和类C的功能,新增三个方法 method1()、 method2()、 method3()。

        要求 类B和类C 满足 可能新增一个方法,两个方法,或者三个方法

    • 用继承扩展(缺点很大)    

        解决办法,用继承关系 给B写7个子类(3个方法的排列组合 2的三次方-1) 给A也写三个子类。

        采用继承的方式扩展B类和C类的功能,会导致子类的数目急剧增加,而且存在重复代码。

    • 装饰者设计模式

        在这种设计模式中,把需要扩展的功能(method1()、method2()、method3())放在装饰类中,装饰器类继承A、因此拥有类A的接口。在装饰器中还包含了一个类A的实例

        因此:装饰器不仅拥有类A实例的功能并且还能扩展类A实例的功能

    下面定义三个装饰器类 Decorator1 Decorator2 Decorator3,他们分别提供一种新增的功能分别是 method1()、method2()、method3()

    public class Decorator1 extends A{
        protected A a;
        public Decorator1(A a){
            this.a=a;
        }    
        public void method1(){
            System.out.println("我是方法1");
        }
    }
    public class Decorator2  extends A{
        protected A a;
        public Decorator2(A a){
            this.a=a;
        }
        public void method2(){
            System.out.println("我是方法2");
        }
    }
    public class Decorator3  extends A{
        protected A a;
        public Decorator3(A a){
            this.a=a;
        }
        public void method3(){
            System.out.println("我是方法3");
        }
    }

    在下面程序中对类B类进行了装饰,使它们具有method1()和method2()的功能 这样可以很灵活的满足需求

    public class Test {
        public static void main(String[] args) {
            A a = new B();
            Decorator1 d1= new Decorator1(a);
            d1.method1();
            
            Decorator2 d2= new Decorator2(a);
            d2.method2();
        }
    }

    可以看到 装饰器设计模式简化了类的继承关系,并且提高代码的可重用性

  • 相关阅读:
    node分离路由文件
    node项目搭建步骤
    在express获取POST(类似表单请求)的数据
    10分钟搭建Kubernetes容器集群平台(kubeadm)
    今日考题
    jQuery方法介绍
    JQuery练习题
    今日面试题:
    bom操作,事件与jquery
    今日理解之js
  • 原文地址:https://www.cnblogs.com/ssskkk/p/9292259.html
Copyright © 2011-2022 走看看