GitHub地址
https://github.com/YEN-GitHub/PatternDemo/tree/master/src/StructuralPattern/DecoratorPattern
裝飾模式概述
Provide a surrogate or placeholder for another object to control access to it.
爲其他對象提供一種代理以控制對這個對象的訪問。
題目
請用裝飾模式(Decorator)爲某遊戲角色設計換裝功能,具體描述如下:
現階段遊戲包含人類(Human)和獸人(Orc)兩種角色(Charactor),在將來可能會增加新角色。
現階段服裝(Finery)包含T恤(TShirt),牛仔褲(Jean),運動鞋(Sneaker),西裝(Suit),領帶(Tie),皮鞋(LeatherShoe)六種,在將來可能會增加新的服裝,並且角色服裝可以依據用戶喜愛自由穿戴。
並搭配出:
紳士風的人類(西裝,領帶,皮鞋);
休閒風的獸人(T恤,牛仔褲,運動鞋);
混搭風的獸人(西裝,領帶,牛仔褲,運動鞋)。
題目中角色和服裝只需要通過輸出語句表示即可,比如:混搭風的獸人(西裝,領帶,牛仔褲,運動鞋),將輸出“運動鞋 牛仔褲 領帶 西裝 裝扮的獸人XXX(名字)”。
UML類圖
代碼
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 12:59
* Abstract:角色
*/
public class Charactor {
public void show(){
}
}
package StructuralPattern.DecoratorPattern.demo1;
import StructuralPattern.DecoratorPattern.demo1.Charactor;
/**
* Created by yangenneng on 2017-05-03 12:59
* Abstract:人類
*/
public class Human extends Charactor {
private String name;
public Human(String name){
this.name=name;
}
public void show(){
System.out.println("--人類:"+name);
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 12:59
* Abstract:獸人
*/
public class Orc extends Charactor {
private String name;
public Orc(String name){
this.name=name;
}
public void show(){
System.out.println("--獸人:"+name);
}
}
package StructuralPattern.DecoratorPattern.demo1;
import StructuralPattern.DecoratorPattern.demo1.Charactor;
/**
* Created by yangenneng on 2017-05-03 13:00
* Abstract:服裝
*/
public class Finery extends Charactor {
protected Charactor charactor;
public Finery(Charactor charactor){
this.charactor=charactor;
}
public void show(){
this.charactor.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:02
* Abstract:T恤
*/
public class TShirt extends Finery {
public TShirt(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return charactor;
}
public void show(){
System.out.print("T恤 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:03
* Abstract:領帶
*/
public class Tie extends Finery {
public Tie(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return this.charactor;
}
public void show(){
System.out.print("領帶 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:03
* Abstract:西裝
*/
public class Suit extends Finery {
public Suit(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return charactor;
}
public void show(){
System.out.print("西裝 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:03
* Abstract:運動鞋
*/
public class Sneaker extends Finery {
public Sneaker(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return charactor;
}
public void show(){
System.out.print("運動鞋 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:03
* Abstract:皮鞋
*/
public class LeatherShoe extends Finery {
public LeatherShoe(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return charactor;
}
public void show(){
System.out.print("皮鞋 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:02
* Abstract:牛仔褲
*/
public class Jean extends Finery {
public Jean(Charactor charactor) {
super(charactor);
}
public Charactor decorator(Charactor charactor){
this.charactor=charactor;
return charactor;
}
public void show(){
System.out.print("牛仔褲 ");
super.show();
}
}
package StructuralPattern.DecoratorPattern.demo1;
/**
* Created by yangenneng on 2017-05-03 13:02
* Abstract:客戶端測試
*/
public class Client {
public static void main(String[] args) {
//人類
Human human=new Human("紳士風");
Orc orc1=new Orc("休閒風");
Orc orc2=new Orc("混搭風");
//裝飾服飾
//紳士風的人類(西裝,領帶,皮鞋)
Suit suit=new Suit(human);//西裝
Tie tie=new Tie(suit);//領帶
LeatherShoe leatherShoe=new LeatherShoe(tie);//皮鞋
leatherShoe.show();
//休閒風的獸人(T恤,牛仔褲,運動鞋)
TShirt tShirt1=new TShirt(orc1);
Jean jean1=new Jean(tShirt1);
Sneaker sneaker1=new Sneaker(jean1);
sneaker1.show();
//混搭風的獸人(西裝,領帶,牛仔褲,運動鞋)
Suit suit2=new Suit(orc2);
Tie tie2=new Tie(suit2);
Sneaker sneaker2=new Sneaker(tie2);
sneaker2.show();
}
}