一.装饰者模式
装饰者模式:通过构造函数,一直对一个基本类进行装饰.
二.装饰者模式-示例-点餐
我们在点餐时,都是在一份米饭上加不同的东西,鸡肉,香菇,等
1.新建一IOrder接口
public interface IOrder {
public int order();
}
2.新建一被装饰类---接下来的所有操作都是在一份米饭上进行的
public class Rice implements IOrder {
private String name = "米饭";
private int price = 3;
@Override
public int order() {
System.out.println("1份"+this.name+"--单价:"+this.price+"元");
return this.price;
}
}
3.新建一装饰者的抽象装饰类
public abstract class MenuDecorater implements IOrder{
private IOrder iOrder;
public MenuDecorater(IOrder iOrder) {
this.iOrder = iOrder;
}
@Override
public int order() {
return iOrder.order();
}
}
4.新建一鸡肉类继承菜单装饰抽象类
public class Chicken extends MenuDecorater{
public Chicken(IOrder iOrder) {
super(iOrder);
}
private String name = "鸡肉";
private int price = 5;
@Override
public int order() {
System.out.println("1份"+this.name+"--单价:"+this.price+"元");
return super.order() + this.price;
}
}
5.新建一香菇类继承菜单装饰抽象类
public class Mushroom extends MenuDecorater {
public Mushroom(IOrder iOrder) {
super(iOrder);
}
private String name = "香菇";
private int price = 3;
@Override
public int order() {
System.out.println("1份"+this.name+"--单价:"+this.price+"元");
return super.order() + this.price;
}
}
6.新建一测试类----比方说我们如果要加菜,就在外层再包裹一层菜类就行
public class Test {
public static void main(String[] args) {
int q = new Chicken(new Rice()).order();
System.out.println(" --------合计:"+q+"元");
System.out.println("==============================");
int i = new Mushroom(new Chicken(new Rice())).order();
System.out.println(" --------合计:"+i+"元");
}
}
7.测试结果----可以动态点餐,动态算费
8.UML图
三.装饰者模式和适配器模式的对比
装饰者模式:是在原基础(米饭)上,进行层层装饰达到不同的效果的,当并未改变米饭这一特性
适配器模式:是通过对老接口原实现的更改,来迎合(适配)新的需求