允許向一個現有的對象添加新的功能,但是不改變其結構。也就是給一個對象做一個在外的包裝。
裝飾者模式的創建思路:
1.定義一個接口,該接口中的方法是必須要實現的方法;
2.設計一個或者多個的裝飾者,每個都繼承接口,並且將接口作爲構造函數的參數傳入;
3.使用一個主體類,繼承接口並且實現確切的功能;
package decorator;
/*
* 裝飾者模式
*/
public abstract class Humburger{
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract Integer getPrice();
}
package decorator;
/*
* 裝飾者模式
*/
public class Chicken extends Humburger{
public Chicken(){
name = "雞腿堡";
}
@Override
public Integer getPrice() {
// TODO Auto-generated method stub
return 10;
}
}
package decorator;
/*
* 裝飾者模式
*/
public class Beef extends Humburger{
public Beef(){
name = "牛肉堡";
}
@Override
public Integer getPrice() {
// TODO Auto-generated method stub
return 15;
}
}
package decorator;
/*
* 裝飾者模式
*/
public abstract class Condiment extends Humburger{
public abstract String getName();
}
package decorator;
/*
* 裝飾者模式
*/
public class Lettuce extends Condiment{
Humburger humburger;
public Lettuce(Humburger humburger){
this.humburger = humburger;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return humburger.getName()+"生菜";
}
@Override
public Integer getPrice() {
// TODO Auto-generated method stub
return humburger.getPrice()+2;
}
}
package decorator;
/*
* 裝飾者模式
*/
public class Chilli extends Condiment{
Humburger humburger;
public Chilli(Humburger humburger){
this.humburger = humburger;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return humburger.getName()+"辣椒";
}
@Override
public Integer getPrice() {
// TODO Auto-generated method stub
return humburger.getPrice();
}
}
package decorator;
/*
* 裝飾者模式
*/
public class CreatHum {
public static void main(String[] args) {
Humburger humburger = new Chicken();
System.out.println(humburger.getName()+" 價錢"+humburger.getPrice());
Lettuce lettuce = new Lettuce(new Beef());
System.out.println(lettuce.getName()+" 價錢"+lettuce.getPrice());
Chilli chilli = new Chilli(new Lettuce(new Beef()));
System.out.println(chilli.getName()+" 價錢"+chilli.getPrice());
Chilli chilli1 = new Chilli(new Lettuce(new Chicken()));
System.out.println(chilli1.getName()+" 價錢"+chilli1.getPrice());
}
}
請關注“知了堂學習社區”,地址:http://www.zhiliaotang.com/portal.php