15.15 混型

        術語混型似乎隨着時間的推移擁有了無數的含義,但是其最基本的感念是混合了多個類的能力,以產生一個可以表示混型中所有類型的類。這往往是你最後的手段,它使組裝多個類變得簡單易行。

        混型的價值之一是它們可以將特性和行爲一致的應用於多個類之上。如果想在混型中修改某些東西,作爲一種意外的好處,這些修改將會應用於混型所應用的所有類型智商。正是由於此,混型有一點面向切面編程的味道(AOP),而切面經常被建議用來解決混型問題。

使用接口來產生混型效果:

/**
 * 獲取時間接口
 */
interface TimeStamped{
    long getStamp();
}

/**
 * 獲取時間實現類
 */
class TimeStampedImpl implements TimeStamped {
    private final long timeStamp;

    public TimeStampedImpl(){
        timeStamp = System.currentTimeMillis();
    }

    @Override
    public long getStamp() {
        return timeStamp;
    }
}

/**
 * 序列化接口
 */
interface SerialNumbered {
    long getSerialNumber();
}

/**
 * 序列化實現類
 */
class SerialNumberedImpl implements SerialNumbered{
    //靜態初始化賦值爲1
    private static long counter = 1;
    //每生成一個類,就先獲取靜態域中的counter,得到之後先賦值給序列值,然後把counter + 1 賦值給counter,用這個簡單的方法來實現序列化
    private final long serialNumber = counter++;

    @Override
    public long getSerialNumber() {
        return serialNumber;
    }
}

/**
 * 基本類接口,提供寫入和獲取的方法
 */
interface Basic{
    public void set(String val);
    public String get();
}

/**
 * 基本類的實現
 */
class BasicImp implements Basic {
    private String value;
    @Override
    public void set(String val) {
        value = val;
    }
    @Override
    public String get() {
        return value;
    }
}

/**
 * 混型類,擁有基本類,序列化接口,和獲取時間的接口功能,但是接口沒有具體實現
 */
class Mixin extends BasicImp implements SerialNumbered,TimeStamped{

    //使用代理模式來實現接口的功能
    private TimeStamped t = new TimeStampedImpl();

    private SerialNumbered s = new SerialNumberedImpl();

    @Override
    public long getStamp() {
        return t.getStamp();
    }

    @Override
    public long getSerialNumber() {
        return s.getSerialNumber();
    }
}

public class Mixins {
    public static void main(String[] args) {
        Mixin mixin1 = new Mixin();
        Mixin mixin2 = new Mixin();
        mixin1.set("test string 1");
        mixin2.set("test string 2");
        System.out.println(mixin1.get() + " " + mixin1.getStamp() + " " + mixin1.getSerialNumber());
        System.out.println(mixin2.get() + " " + mixin2.getStamp() + " " + mixin2.getSerialNumber());
    }
}
test string 1 1531060180687 1
test string 2 1531060180688 2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章