Java设计模式之装饰者模式

Posted jeasonchen001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之装饰者模式相关的知识,希望对你有一定的参考价值。

装饰者模式的简单应用,模拟咖啡店的点单结算,在不改变原本的类的基础上重新创建新的类实现更多的功能

一般的饮品添加调料需要加钱,并且结算的时候饮品的调料种类也必须知道,装饰值模式的应用代码:

被装饰类的超类或接口

package mycoffee;
//装饰者与被装饰者的超类或接口
public interface Drink {
//定义两个抽象方法
       public static String name="";
       public static double price=0;
       String description();
       double cost();
}

被装饰类1

package mycoffee;
//被装饰者
public class Coco implements Drink{
       public String description() {
             return  "可口可乐";
       }

       public double cost() {

             return 3.0d;
       }

}

被装饰类2

package mycoffee;
//被装饰者
public class Coffee implements Drink {

       public String description() {
             return "咖啡";
       }
       public double cost() {
             return 10.0d;
       }

}
装饰类的基类,实现了被装饰类的接口,具体实现方法根据具体的被装饰类的方法一样
亦可以定义一个抽象类,只需要,获得被装饰类的对象,实现抽象类,但是抽象类
package mycoffee;
//装饰者基类,继承被装饰者的抽象类
public class Extension implements Drink {
public Drink drink=null;
//接口不能拥有构造方法,接口不能直接new出来
//需要拥有被装饰者接口的方法
//创建一个构造方法
public Extension(Drink d)
{
       //创建构造方法,可以实现与被装饰者同样的功能
       this.drink=d;
}
public String description() {
       // TODO Auto-generated method stub
        return drink.description();
}

public double cost() {
       // TODO Auto-generated method stub
       return drink.cost();
}

}

装饰类1

package mycoffee;
//继承装饰类的基类
public class Bean extends Extension{

       public Bean(Drink d) {
             //父类的构造方法
             super(d);
             // TODO Auto-generated constructor stub
       }
       //重写父类的方法
@Override
public String description()
{
       return drink.description()+"+"+"豆子";

}
@Override
public double cost()
{
       return drink.cost()+3.0d;
       }
}

装饰类2

package mycoffee;
//
public class Sugar extends Extension{

       public Sugar(Drink d) {
             super(d);
             // TODO Auto-generated constructor stub
       }

       @Override
       public String description() {
             // TODO Auto-generated method stub
             return super.description()+"+"+"糖";
       }
       @Override
       public double cost() {
             // TODO Auto-generated method stub
             return super.cost()+2.0d;
       }

}

测试结果

package mycoffee;
//测试加了豆子的测试类
public class Test {
public static void main(String[] args) {
       Bean b=new Bean(new Coffee());
       System.out.println("点的饮品是:"+b.description());
       System.out.println("总共需要:"+b.cost());
       System.out.println("--------------------");
       Drink d=new Sugar(new Coco());
       System.out.println("点的饮品是:"+d.description());
       System.out.println("总共需要:"+d.cost());
}
}
console:
点的饮品是:咖啡+豆子
总共需要:13.0
--------------------
点的饮品是:可口可乐+糖
总共需要:5.0

以上是关于Java设计模式之装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式之装饰者模式

设计模式之装饰者模式

Java设计模式之装饰者模式

Java设计模式系列之装饰者模式

JAVA设计模式之装饰者模式

java设计模式之装饰者模式学习