術語混型似乎隨着時間的推移擁有了無數的含義,但是其最基本的感念是混合了多個類的能力,以產生一個可以表示混型中所有類型的類。這往往是你最後的手段,它使組裝多個類變得簡單易行。
混型的價值之一是它們可以將特性和行爲一致的應用於多個類之上。如果想在混型中修改某些東西,作爲一種意外的好處,這些修改將會應用於混型所應用的所有類型智商。正是由於此,混型有一點面向切面編程的味道(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