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设计模式之装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章