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

    一、定义

     动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。

    • Component:装饰者和被装饰者共同的父类,是一个接口或者抽象类,用来定义基本行为
    • ConcreteComponent:定义具体对象,即被装饰者
    • Decorator:抽象装饰者,继承自Component,从外类来扩展ConcreteComponent。对于ConcreteComponent来说,不需要知道Decorator的存在,Decorator是一个接口或抽象类
    • ConcreteDecorator:具体装饰者,用于扩展ConcreteComponent
    举个例子:
    假设一家甜品店,出售蛋糕,除了蛋糕外,还可以在蛋糕上布置水果,蜡烛等,但是水果和蜡烛需要额外收费,**假设一个蛋糕的价格是66元,水果和蜡烛分别需要额外付10元,那么怎么样来动态的计算价格呢? 首先定义组件类,也是装饰者和被装饰者的超类Sweet .java
    1 public abstract class Sweet {
    2     String description = "Sweet";
    3 
    4     public String getDescription() {
    5         return description;
    6     }
    7 
    8     public abstract double cost();
    9 }

    定义被装饰者蛋糕类,Cake .java

     1 public class Cake extends Sweet {
     2     @Override
     3     public String getDescription() {
     4         return "一个蛋糕";
     5     }
     6 
     7     @Override
     8     public double cost() {
     9         return 66;
    10     }
    11 }

    定义抽象装饰者类Decorator.java

    1 public abstract class Decorator extends Sweet {
    2     public abstract String getDescription();
    3 }

    定义具体装饰者水果类,FruitDecorator.java

     1 public class FruitDecorator extends Decorator {
     2     Sweet sweet;
     3 
     4     public FruitDecorator(Sweet sweet) {
     5         this.sweet = sweet;
     6     }
     7 
     8     @Override
     9     public String getDescription() {
    10         return sweet.getDescription() + ",水果";
    11     }
    12 
    13     @Override
    14     public double cost() {
    15         return sweet.cost() + 10;
    16     }
    17 }

    定义具体装饰者蜡烛类,CandleDecorator.java

     1 public class CandleDecorator extends Decorator {
     2     Sweet sweet;
     3 
     4     public CandleDecorator(Sweet sweet) {
     5         this.sweet = sweet;
     6     }
     7 
     8     @Override
     9     public String getDescription() {
    10         return sweet.getDescription() + ",蜡烛";
    11     }
    12 
    13     @Override
    14     public double cost() {
    15         return sweet.cost() + 10;
    16     }
    17 }

    最后根据不同的选择来结算价格

     1 public static void main(String[] args) {
     2 
     3     Cake cake = new Cake();
     4     System.out.println(cake.getDescription() + "总共花费" + cake.cost());
     5 
     6     FruitDecorator fruitDecorator = new FruitDecorator(cake);
     7     System.out.println(fruitDecorator.getDescription() + "总共花费" + fruitDecorator.cost());
     8 
     9     CandleDecorator candleDecorator = new CandleDecorator(fruitDecorator);
    10     System.out.println(candleDecorator.getDescription() + "总共花费" + candleDecorator.cost());
    11 
    12     }

    参考:

    https://juejin.im/post/5a33e7d76fb9a045167d412c



  • 相关阅读:
    神经网络学习之----单层感知器
    神经网络学习之----神经网络发展史
    神经网络学习之----神经网络概述
    C语言几种常见的字符串输入
    基于单链表实现集合的交集、并集、差集的运算
    关于单链表的一些基本操作
    输入20个整数存放到一个单向链表中,并顺序逆序输出
    《你的灯亮着吗》阅读笔记
    场景调研
    站立会议总结09
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10496480.html
Copyright © 2011-2022 走看看