您的位置:首页 > 其它

装饰着模式

2016-04-15 12:50 211 查看
装饰着模式涉及的角色

抽象构建角色:定义一个抽象接口,来规范准备附加功能的类

具体构件角色:将要被附加功能的类,实现抽象构件角色接口

抽象装饰者角色:持有对具体构件角色的引用并定义与抽象角色一致的接口

具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外的功能。

例如有如下场景,卖饮料,可以是酸梅汤,豆浆等。假如纯豆浆(soya)卖五元,现在有三种配料,鸡蛋,糖,黑豆,都可以组合,可以是鸡蛋+豆浆+黑豆,也可以是豆浆加黑豆,各种组合,假如说每一种做法都要写一个类的话,那得需要写很多,会造成类爆炸。

这时装饰者模式就派上用场,

1)因为所有方法的豆浆都属于饮料,所以我先设计一个被装饰的接口Drink类,后期可以定义卖豆浆,卖酸梅汤

2)SoyaBeanMilk 这是具体的被装饰着对象,属于被装饰着,后面的黑豆糖属于装饰着

3)定义一个黑豆、糖、豆浆的装饰着基类,所有类都继承于它,在里面设定各种方法,此场景下设计describe和cost两个方法

4)定义 EggDecorator,SugarDecorator,BlackBeanDecorator,属于具体的装饰着对象,继承与装饰者基类

5)test类,负责具体的操作

装饰者模式的实现

1)具体类

Drink 被装饰者对象的接口

SoyaBeanMilk.java 具体的被装饰者对象

EggDecorator 具体装饰者对象

SugarDecorator.java 具体装饰者对象

BlackBeanDecorator.java 具体装饰者对象

Decorator.java 装饰者基类

Test.java 测试

2)代码如下

被装饰者装饰的接口

public interface Drink_decorator {
//饮料的描述信息
public String description();
//计算价格
public float cost();
}
//具体的被装饰者对象,豆浆是饮料,需要实现饮料的接口
public class SoyaBeanMilk implements Drink_decorator{

@Override
public String description() {
// TODO Auto-generated method stub
return "纯豆浆";
}

@Override
public float cost() {
// TODO Auto-generated method stub
return 5f;
}
}


装饰者基类,关联Drink

public  abstract class Decorator implements Drink_decorator{
private Drink_decorator drink;//要装饰的对象
public Decorator(Drink_decorator drink) {
// TODO Auto-generated constructor stub
this.drink=drink;
}
@Override
public String description() {
// TODO Auto-generated method stub
return drink.description();
}

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


具体的装饰者对象,黑豆

public class BlackBeanDecorator extends Decorator{

public BlackBeanDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}

@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"黑豆";
}

@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+1f;
}

}


具体的装饰者对象 鸡蛋

public class EggDecorator extends Decorator{

public EggDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}

@Override
public String description() {
// TODO Auto-generated method stub
return super.description()+"鸡蛋";
}

@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+2f;
}

}


具体的装饰着对象,糖的装饰者对象

public class SugarDecorator extends Decorator{

public SugarDecorator(Drink_decorator drink) {
super(drink);
// TODO Auto-generated constructor stub
}

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

@Override
public float cost() {
// TODO Auto-generated method stub
return super.cost()+0.5f;
}
}


测试类

public class test {

public static void main(String[] args) {
// TODO Auto-generated method stub
//生产一杯豆浆
Drink_decorator soya=new SoyaBeanMilk();
//在豆浆中加鸡蛋
EggDecorator eggsoya=new EggDecorator(soya);
//在加了鸡蛋的豆浆中加糖
SugarDecorator sugar=new SugarDecorator(eggsoya);
//在加了糖加了鸡蛋的豆浆中假如黑豆
BlackBeanDecorator blackBeanDecorator=new BlackBeanDecorator(sugar);

//结账
System.out.println("您点的是:"+blackBeanDecorator.description());
System.out.println("您一共消费了多少钱:"+blackBeanDecorator.cost()+"元");
}

}


结果

您点的是:纯豆浆鸡蛋糖黑豆
您一共消费了多少钱:8.5元
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: