java的23種設計模式之裝飾者模式
這裡給大家推薦一篇文章裡面介紹了23種設計模式https://www.aliyun.com/jiaocheng/811770.html;
下面則是我學習裝飾者的見解:
關於裝飾者模式運用的地方其實有很多,我第一次接觸到就是io流中,比如像這樣的:
new InputStreamReader (new BufferedInputStream (new FileInputStream("text.txt")));一連串的包裝,這是因為他們就是裝飾者模式他們都是實現InputStream這一介面都是同一型別。可以這樣理解:現在有一個位元組流的原型已經被創建出來了,但是實際上位元組流不滿足需求,然後就給它裝飾成緩衝流,試一下發現還是不行就再給它裝飾成字元流(也就是所謂的轉換流)用的就是裝飾者模式。但它的這種裝飾是重新裝飾而不是像穿衣服一樣套一件又一件,下面就將一下多個裝飾者的實現類:
1.英雄聯盟的人物模型
2.比如分法師,坦克,adc等
3.裝備(帽子,護甲,無盡等)
抽象構件
package com.decorate;
/**
* 抽象構件
* @author zy
*
*/
public interface iFunction {
String descript();
}
具體實現構件
package com.decorate.concrete;
import com.decorate.iFunction;
/**
* 具體構件
* @author zy
*
*/
public class Warrior implements iFunction {
@Override
public String descript() {
// TODO Auto-generated method stub
return "adc";
}
}
裝飾者(抽象類)
package com.decorate.impl;
import com.decorate.iFunction;
/**
* 裝飾者
* 依賴倒置:讓所有具體類都依賴抽象類
* @author zy
*
*/
public abstract class abstractImpl implements iFunction {
private iFunction targert;
public abstractImpl(iFunction targert) {
this.targert=targert;
}
@Override
public String descript() {
// TODO Auto-generated method stub
return targert.descript();
}
}
裝飾者實現類
package com.decorate.impl.type;
import com.decorate.iFunction;
import com.decorate.impl.abstractImpl;
/**
* 具體類實現抽象類
* @author zy
*
*/
public class Hat extends abstractImpl{
public Hat(iFunction targert) {
super(targert);
}
@Override
public String descript() {
return super.descript()+"裝備了帽子";
}
}
package com.decorate.impl.type;
import com.decorate.iFunction;
import com.decorate.impl.abstractImpl;
public class Camail extends abstractImpl{
public Camail(iFunction targert) {
super(targert);
}
@Override
public String descript() {
return super.descript()+"裝備了護甲";
}
}
package com.decorate.impl.type;
import com.decorate.iFunction;
import com.decorate.impl.abstractImpl;
public class Attact extends abstractImpl{
public Attact(iFunction targert) {
super(targert);
}
@Override
public String descript() {
return super.descript()+"裝備上了無盡";
}
}
測試類
package com.decorate.test;
import com.decorate.iFunction;
import com.decorate.concrete.Warrior;
import com.decorate.impl.type.Camail;
import com.decorate.impl.type.Attact;
import com.decorate.impl.type.Hat;
public class Test {
public static void main(String[] args) {
iFunction target=new Warrior();
String des=new Attact(target).descript();
System.out.println(des);
System.out.println("=======================================");
des=new Camail(new Hat(new Attact(target))).descript();
System.out.println(des);
}
}
裝飾者的作用就是在原有方法的基礎上強化該方法,就跟玩遊戲一樣裝備越多越厲害。。。。不說了玩遊戲去的,不對學習去了。。。