装饰者模式第一篇
装饰者模式含有的几个成员:
(1)装饰者:装饰者继承自被继承者,但同时又含有一个被装饰者的对象引用(用来确定塔装是哪一个对象),装饰者“有一个”组件(即装饰者含有一个被装饰者的对象引用,将被装饰者的一些方法委托于该引用——即通过该引用调用被装饰者的一些方法)。装饰者通过调用(继承自与具体被装饰者共同的)父类的一些方法(这些方法中通过被装饰者的对象引用调用被装饰者的方法)来实现装饰被装饰者对象的目的。
(2)具体装饰者:继承自装饰者的具体的装饰者;
(3)被装饰者:被装饰者是装饰者与具体装饰着共同的超类,它使得具体装饰者与装饰者类型匹配。
(4)具体被装饰者:继承自被装饰者。
注:(1)装饰者模式类似于盖房子,装饰者相当于材料,显而易见,房子就是被装饰者(主题)
(2)装饰者与被装饰者既是继承关系又是依赖关系(装饰者继承于被装饰者,同时装饰者又依赖于被装饰者(因为装饰者中含有一个被装饰者的对象引用))
(3)装饰者依赖其中的被装饰者的对象引用来调用被装饰者中的方法(在具体装饰者类的同名方法中调用被装饰者对象的同名方法来达到修改(装饰)被装饰者方法的目的)。
(4)装饰者继承自被装饰者的原因在于:使被装饰者能够被装饰者装饰(即使二者类型相匹配)
以下是我的关于装饰者模式的一个代码实例(现实中的向饮料中加材料):
public abstract class yinliao //被装饰者,含有三个抽象方法
{
public abstract String name(); //返回对象的名字
public abstract double cost();
public abstract void biaojia();
}
public class cailiao extends yinliao //装饰者,继承自超类——被装饰者
{
public double cost()
{
return 0.0;
}
public void biaojia()
{
}
@Override
public String name() {
return "";
}
}
public class redtea extends yinliao //具体被装饰者,继承自超类——装饰者类
{
double price=3.0; //红茶的基础价格
public String name="红茶"; //该饮品的名称为:红茶
public redtea()
{
}
public double cost() {
return price;
}
public void biaojia()
{
System.out.println("红茶原价为:3元");
}
public String name()
{
return name;
}
}
public class cafei extends cailiao
{
double price=2.0; //每斤牛奶的价钱
int jinshu;
yinliao yin;
public cafei(yinliao yin,int jinshu)
{
this.yin=yin; //让牛奶装饰某个饮料;
this.jinshu=jinshu;
}
public double cost()
{
double sumprice;
sumprice=jinshu*price+yin.cost(); //将被装饰者的cost方法委托于对象引用yin(即通过yin调用被装饰对象的cost方法)
return sumprice;
}
public String name()
{
return yin.name();
}
public void biaojia()
{
System.out.println("您这瓶"+yin.name()+"价钱为:"+cost());
}
}
public class milk extends cailiao //具体装饰者
{
double price=1.0; //每斤牛奶的价钱
int jinshu; //要装饰的量
yinliao yin; //被装饰类的对象引用,用于将他的一些方法委托于该变量调用
public milk(yinliao yin,int jinshu)
{
this.yin=yin; //让牛奶装饰某个饮料;
this.jinshu=jinshu;
}
public double cost()
{
double sumprice;
sumprice=jinshu*price+yin.cost(); //将被装饰者的cost方法委托于对象引用yin(即通过yin调用被装饰对象的cost方法)
return sumprice; //返回被装饰者被装饰后的价格;
}
public String name()
{
return yin.name(); //返回被装饰者的名字
}
public void biaojia()
{
System.out.println("您这瓶"+yin.name()+"价钱为:"+cost()); //输出被装饰后的标价;
}
}
public class test {
public static void main(String[] args) {
// TODO code application logic here
yinliao hongcha=new redtea();
cailiao niunai=new milk(hongcha,2);
System.out.println("老板,给我来瓶红茶加两块钱的奶!!");
niunai.biaojia();
System.out.println("老板再加五块钱的奶!!");
niunai=new milk(niunai,5);
niunai.biaojia();
System.out.println("老板再给我加两斤咖啡!!");
niunai=new cafei(niunai,2);
niunai.biaojia();
}
}