zoukankan      html  css  js  c++  java
  • 设计模式-装饰者模式

         这一章看完之后,我感觉,装饰者模式就是对类继承的一种递归调用式的组合应用,很好的是实现了开闭原则,可以有效的扩展应用程序。比如书中的例子,有几种饮料,每种饮料的价格已经知道了,但是我们又有很多种的调料,每种调料也有它的价格,我们现在需要是在饮料中加调料,那么这样一来,饮料的售价就会变化,如何来描述这种售价呢?如果通过对调料种类的组合来定义若干的类,肯定是非常愚蠢的行为。

         通过装饰者模式,就能很好的解决这个问题,我们将这些类分为装饰类(调料),待装饰类(饮料)两种,这两种类继承同一个父类,不同的是装饰类中的构造函数有一个父类引用的构造函数,这样子就可以递归调用构造函数来进行 装饰了。

    public class A extends BaseClass{
        
        public string who()
        {
            return "A";
        }
    
        public int cost()
        {
            return 5;
        }
    }

    我们定义一个待装饰类A,再定义几个装饰类:

    public class decorator1 extends BaseClass{
        BaseClass baseClass;    
        public decorator1(BaseClass t)
        {
            this.baseClass = t;
        }
        public string who()
        {
            return baseClass.who()+",decoratro1";    
        }    
        public int cost()
        {
            return baseClass.cost()+10;
        }
    }
    public class decorator2 extends BaseClass{
        BaseClass baseClass;    
        public decorator2(BaseClass t)
        {
            this.baseClass = t;
        }
        public string who()
        {
            return baseClass.who()+",decoratro2";    
        }    
        public int cost()
        {
            return baseClass.cost()+20;
        }
    }

    然后我们在用decorator1 和decorator2 来装饰A的时候,就有了很犀利的调用方法:

    A  a;
    a=new decorator1(a);
    a=new deocorator2(a);
    system.out.println(a.who());
    system.out.println(a.cost());

    这样子 输出就是

    A,decorator1,decorator2
    35

    实际的调用过程就是一个递归的过程。

    装饰者模式的定义:

    装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案

    其中用到的设计原则:

    开闭原则:对扩展开放,对修改关闭
  • 相关阅读:
    无向图求所有路径C#版
    centos 7 无痛安装 es
    rust 实现协程池
    spring boot fat jar 引入新的jar 文件到classpath
    nicolaka/netshoot 强大的容器网络问题解决工具
    使用nsenter 解决tcpcollect容器网络捕捉问题
    centraldogma git 镜像配置
    jmespath java 使用
    使用apicurio-registry 管理schema
    bfe 简单学习示例
  • 原文地址:https://www.cnblogs.com/xtestw/p/3947617.html
Copyright © 2011-2022 走看看