术语混型似乎随着时间的推移拥有了无数的含义,但是其最基本的感念是混合了多个类的能力,以产生一个可以表示混型中所有类型的类。这往往是你最后的手段,它使组装多个类变得简单易行。
混型的价值之一是它们可以将特性和行为一致的应用于多个类之上。如果想在混型中修改某些东西,作为一种意外的好处,这些修改将会应用于混型所应用的所有类型智商。正是由于此,混型有一点面向切面编程的味道(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