码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式之装饰者模式

时间:2019-02-14 13:12:59      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:stat   const   rip   xtend   font   generated   cto   script   方法   

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

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

被装饰类的超类或接口

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设计模式之装饰者模式

标签:stat   const   rip   xtend   font   generated   cto   script   方法   

原文地址:https://www.cnblogs.com/jeasonchen001/p/10373963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!