zoukankan      html  css  js  c++  java
  • java_设计模式_装饰设计模式

    package IO;


    /* * 装饰设计模式 模拟咖啡
    * 1.抽象组件:需要装饰的抽象对象(接口或抽象父类)
    * 2.具体组件:需要装饰的对象
    * 3.抽像装饰类:包含了对抽象组件的引用以及装饰着共有的方法
    * 4,具体装饰类:被装饰的对象
    * */
    public class Test2 {
    public static void main(String[] args) {
    Drink coffee=new Coffee();
    System.out.println(coffee.info()+"--->"+coffee.cost());
    Drink suger=new Suger(coffee);
    //装饰
    System.out.println(suger.info()+"--->"+suger.cost());
    Drink milk=new milk(coffee);
    System.out.println(milk.info()+"--->"+milk.cost());
    milk=new milk(suger);
    System.out.println(milk.info()+"--->"+milk.cost());
    }
    }
    //抽象组件
    interface Drink{
    double cost();//费用
    String info();//说明
    } //具体组件
    class Coffee implements Drink{
    private String name="原味咖啡";
    @Override
    public double cost() {
    return 10;
    }
    @Override
    public String info() {
    return name;
    }
    }
    //抽象装饰类
    abstract class Decorate implements Drink{ //对抽象组件的引用
    private Drink drink;
    public Decorate(Drink drink){
    this.drink=drink; }
    @Override
    public double cost() {
    return this.drink.cost();
    }
    @Override
    public String info() {
    return this.drink.info();
    }
    }
    //具体的装饰类
    class milk extends Decorate{
    public milk(Drink drink) {
    super(drink);//super(参数):调用基类中的某一个构造函数
    }
    @Override
    public double cost() {
    return super.cost()*4;
    }
    @Override
    public String info() {
    return super.info()+"加入了牛奶";
    }
    }
    //具体的装饰类
    class Suger extends Decorate{


    public Suger(Drink drink) {
    super(drink);
    }
    @Override
    public double cost() {
    return super.cost()*2;
    }
    @Override
    public String info() {
    return super.info()+"加入了蔗糖";
    }
    }
    class Cat{

    public Cat(Object obj) {
    // super();
    }
    public Cat(Object obj,Object obj1) {
    // super();
    }
    }
    class cat01 extends Cat{

    public cat01(Object obj,Object obj1) {
    super(obj);
    /*记住一点:在构造子类时,一定会调用到父类的构造方法。因为父类中的元素也需要被初始化。
    * 所以父类要么有一个默认的无参数构造,这样Java会自动调用这个无参数的构造。
    * 如果父类没有无参数的构造,那么就要你自己在子类的构造中,通过super()的方式调用父类的无参构造 */
    }
    }

  • 相关阅读:
    android 颜色值参考,(有颜色图
    Virtual address cache memory, processor and multiprocessor
    VUEJS2.0源码理解--优
    qlserver、Mysql、Oracle三种数据库的优缺点总结
    三层与MVC
    数据结构 常用定义
    c语言 typedef
    C动态内存分配
    c 指针(一)
    stdlib 头文件
  • 原文地址:https://www.cnblogs.com/wcss/p/11031540.html
Copyright © 2011-2022 走看看