概念
- 在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.
设计原则
- 要使用装饰者模式,需要满足以下设计原则
* 多用组合,少用继承
* 开放_关闭原则:类应该对拓展开放,对修改关闭.
下面以汉堡为例
public interface Hanbeger {
//价钱
public float price();
//名字
public String name();
}
//被装饰者
public class GoldHanbeger implements Hanbeger{
@Override
public float price() {
return 10;
}
@Override
public String name() {
return "黄金馒头";
}
}
public abstract class peicai implements Hanbeger{
private Hanbeger hanbeger;
public peicai(Hanbeger h){
this.hanbeger = h;
}
@Override
public String name() {
return this.hanbeger.name();
}
@Override
public float price() {
return this.hanbeger.price();
}
}
public class Shengcai extends peicai{
public Shengcai(Hanbeger h) {
super(h);
}
@Override
public float price() {
return super.price()+5;
}
@Override
public String name() {
return super.name()+"加生菜";
}
}
//牛肉
public class Beff extends peicai {
public Beff(Hanbeger h) {
super(h);
}
@Override
public String name() {
return super.name()+"加牛肉";
}
@Override
public float price() {
return super.price()+20;
}
}
public class Text {
public static void main(String[] args) {
GoldHanbeger gold = new GoldHanbeger();
System.out.println(gold.name()+"价钱" + gold.price());
//牛肉汉堡
Beff beff = new Beff(gold);
System.out.println(beff.name()+"价钱" + beff.price());
//牛肉生菜汉堡
Shengcai shencai = new Shengcai(beff);
System.out.println(shencai.name() + "价钱" + shencai.price());
}
}
我对于这种模式理解是这样的:这就像是做菜一样,我先要确定要做什么,要有一个大致方向,在汉堡的例子里,我先确定了我要的是汉堡,这就需要定义一个汉堡接口,因为这是基本.那么在汉堡中又有很多分类像是鸡腿堡 鳗鱼堡 黄金汉堡之类的,在这里我选的是黄金汉堡.当然黄金汉堡是一个实现汉堡接口的类.在有了最基本的汉堡之后我们就需要加入一些配菜了,配菜是一个类,那么配菜也有很多种类 像是生菜 牛肉 芥末之类的,在写具体的配菜时需要继承配菜类,因为这些都属于配菜.最后就是一个测试类了,如下是运行结果:
黄金馒头价钱10.0
黄金馒头加牛肉价钱30.0
黄金馒头加牛肉加生菜价钱35.0