1. 程式人生 > >java的23種設計模式之裝飾者模式

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);
    }
}

裝飾者的作用就是在原有方法的基礎上強化該方法,就跟玩遊戲一樣裝備越多越厲害。。。。不說了玩遊戲去的,不對學習去了。。。