美文网首页
装饰者模式

装饰者模式

作者: G先生_海林 | 来源:发表于2019-01-07 23:39 被阅读64次

设计原则

类应该对扩展开放,对修改关闭

设计原则用起来是很抽象不容易掌握,我先列出来让大脑形成一个意识,在编程的时候,去往这上边靠一靠,时间久了,也会有感觉的。对于高手来说,可能并没有设计模式这一说, 他们写的代码,不知觉的就有良好的设计。

学习一个东西,目的就是要让我们可以变的更好,学习设计模式也是一样的,首先我们要做的就是识别模式,这样用起来,也就轻而易举了。

1.认识

装饰者模式中有一个主体,可能有多个修饰主体的对象,比如我们常见的各种各样的奶茶,主体是奶茶,装饰者就是珍珠,波霸,柠檬汁等等,然后依赖委托就可以给各种奶茶制定价格了。

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

2.UML 类图

设计模式.png

3.应用场景描述

我们来到一家咖啡馆,我们刚坐下,一位服务员迎上来,给我们递了一个咖啡种类的清单,上面有,浓缩(Espresso)咖啡,黑糖咖啡,黑糖牛奶咖啡,豆浆咖啡,摩卡豆浆拿铁咖啡,卡布奇诺等,还有么有写出来的,估计你想要什么样的咖啡,只要你告诉咖啡师,他们都能给你做出来,面对种类越来越多的咖啡,如果他们的老板找到你,想让你帮他们设计一个咖啡售卖的系统,价值20万,你会怎么设计呢?接下来我们就用装饰者模式,来进行设计
/其实还有很多的实例,在生活及工作中我们需要仔细的思考和观察,就会有所发现,识别出模式,然后使用模式,可以给自己的工作带来很高的效率,前提是一定要用对/

4.代码实现

  • 1.创建一个抽象的主体的类
package com.pattern.decorator;
/**
* 基类
*/
public abstract class Beverage {
   
   String description=" xxx beverate";
   
   public String getDescription(){
       return description;
   }
   
   
   public abstract double cost();

}
  • 2.创建抽象的修饰类继承主体类
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
    //所有的具体修饰者都必须重现实现 getDescription()方法,想想为什么?
}
  • 3.实现主题类的具体类
/**
* 
* 浓缩咖啡-实现主体的类
*/
public class Espresso extends Beverage {
    
    public Espresso(){
        description="Espresso";
    }

    @Override
    public double cost() {
         
        return 1.99;
    }

}

第二个实现类

/**
* 牛奶咖啡-实现主体的类
*/
public class MilkCoffe extends Beverage {

    public MilkCoffe(){
        description="MilkCoffe";
    }
    @Override
    public double cost() {
        return 2.11;
    }

}

  • 4.实现修饰类的具体类,有几种修饰就可以写几种
/**
* 摩卡-具体的修饰类
*/
public class Mocha extends CondimentDecorator {
    Beverage beverage;
    
    public Mocha(Beverage beverage){
        this.beverage=beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription()+",Mocha ";
    }
    //加了调料之后的咖啡价格
    @Override
    public double cost() {
        return beverage.cost()+1;
    }

}

/**
* 修饰类
*/
public class Sugar extends CondimentDecorator {
    
    Beverage beverage;
    
    public Sugar(Beverage beverage){
        this.beverage=beverage;
    }

    @Override
    public String getDescription() {
         
        return beverage.getDescription()+", Sugar ";
    }

    @Override
    public double cost() {
        return beverage.cost()+5;
    }

}
  • 5.测试:供应饮料
public class StartbarkCoffee {
    
    public static void main(String[] args) {
        Beverage b1=new Espresso();//创建一个浓缩咖啡
        //1.99
        System.out.println(b1.getDescription()+" 售价:"+b1.cost());
        
        Beverage b2=new MilkCoffe();//牛奶咖啡
        //加入配料的咖啡
        b2=new Mocha(b2);//用mocha 来修饰
        b2=new Sugar(b2);//用糖来修饰
        //预计结果是:2.11+1+5=8.11
        System.out.println(b2.getDescription()+" 售价:"+b2.cost());
    }
}

5.运行效果

Espresso 售价:1.99
MilkCoffe,Mocha , Sugar  售价:8.11

6.总结

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

7.扩展

记得有次去面试,面试官问我,你知道java 的I/O 中在创建流的时候,一般会嵌套几个,提高效率比如加入缓冲流,你知道这是用了什么设计模式吗?
当时我就是不知道,面试也没有成功,回来后默默的去查了一下,原来是装设折模式,突然就想起来,曾经知道过,但是当时为什么面试的时候没有想起来呢?其实是对知识掌握的不牢,也没有将知识形成知识晶体,存储在脑子里面是碎片化的记忆,很容易忘掉,在以后的学习过程要让知识形成强关系,这样才不会很容易的被遗忘,如果忘记了,还可以通过关系网想起来。谨记

相关文章

  • 如何利用装饰者模式在不改变原有对象的基础上扩展功能

    目录 什么是装饰者模式 普通示例 装饰者模式示例 类图关系 装饰者模式使用场景 装饰者模式优点 装饰者模式缺点 什...

  • 装饰者模式

    装饰者模式 装饰者模式和适配器模式对比 装饰者模式 是一种特别的适配器模式 装饰者与被装饰者都要实现同一个接口,主...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式-装饰者模式

    装饰者模式概念: 装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关...

  • java - 装饰者模式

    装饰者模式 装饰者模式:动态将责任添加到对象上。如果需要扩展功能,装饰者提供了比继承更有弹性的解决方案。装饰者模式...

  • 设计模式之装饰者模式(Decorator Pattern)

    What: 装饰者模式又名包装(Wrapper)模式。装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提...

  • 装饰者(Decorator)模式

    装饰者(Decorator)模式装饰模式又名包装(Wrapper)模式。装饰模式是继承关系的一个替代方案。装饰模式...

  • 2、装饰者模式

    装饰者模式 一、基本概念 二、结构 三、案例1、装饰者模式案例2、JavaIO中使用装饰者模式 四、总结 一、基本...

  • PHP的设计模式-装饰者模式

    装饰者模式 装饰者模式 装饰者模式类似蛋糕,有草莓味、奶酪等种类,但是它们的核心都是蛋糕。 不断地将对象添加装饰的...

  • 设计模式 | 装饰者模式及典型应用

    前言 本文的主要内容: 介绍装饰者模式 示例 源码分析装饰者模式的典型应用Java I/O 中的装饰者模式spri...

网友评论

      本文标题:装饰者模式

      本文链接:https://www.haomeiwen.com/subject/saxmrqtx.html