装饰设计模式
1、抽象组件:需要装饰的抽象接口(接口或抽象父类)
2、具体组件:需要装饰的对象
3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
4、具体装饰类
举例1:模拟声音放大功能
public class DecorateTest1 {
public static void main(String[] args) {
Person p = new Person();
p.say();
Amplofier am = new Amplofier(p);
am.say();
}
}
interface say{
void say();
}
class Person implements say{
private int voice=10;
public int getVoice() {
return voice;
}
public void setVoice(int voice) {
this.voice = voice;
}
public void say() {
System.out.println("人的声音为:"+this.getVoice());
}
}
class Amplofier implements say{
private Person person;
public void say() {
}
public Amplofier(Person p) {
this.person = p;
System.out.println("人的声音为:"+person.getVoice()*10);
// TODO 自动生成的构造函数存根
}
}
举例2:咖啡加糖加奶
public class DecorateCoffee {
public static void main(String[] args) {
drink coffee = new Coffee();
drink sugar = new Sugar(coffee);//装饰
System.out.print(sugar.info()+"-->>"+sugar.cost());
drink milk = new Milk(coffee);//装饰
System.out.println(milk.info()+"-->"+milk.cost());
milk = new Milk(sugar);//装饰
System.out.println(milk.info()+"-->"+milk.cost());
}
}
//抽象组件
interface drink{
double cost();
String info();
}
//具体组件
class Coffee implements drink{
private String name="咖啡";
public double cost() {
return 10;
}
public String info() {
return name;
}
}
//抽象装饰类
abstract class Decorate implements drink{
private drink d;
public double cost() {
return this.d.cost();
}
public String info() {
return this.d.info();
}
public Decorate(drink di) {
// TODO 自动生成的构造函数存根
this.d = di;
}
}
//具体装饰类
class Milk extends Decorate{
public Milk(drink dri) {
// TODO 自动生成的构造函数存根
super(dri);
}
public double cost() {
return super.cost()*4;
}
public String info() {
return super.info()+"加入牛奶";
}
}
class Sugar extends Decorate{
public double cost() {
return super.cost()*3;
}
public String info() {
return super.info()+"加入了糖";
}
public Sugar(drink dri) {
super(dri);
}
}