Five:原型模式
该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的。
package com.zcl.design.prototype;
public class Prototype implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
}
实现Cloneable意义在于一个标记,因为Cloneable中没有任何方法。这个借口只是来标示着这个对象是可拷贝的。
上文代码中的super.clone()中的super是指Object所以不用再extends具体类。
实现该模型的意义在于因为clone是从内存里面以二进制字节流的形式进行复制,时间很短,在要生产大量相同或者相似对象的时候是很有用的。比如你要发送一个优惠短信给你的用户,如果你要一个个产生上千万个对象的话,一个以0.02秒来进行计算的话,那就要发几十个小时,也就是几天的时间。这是肯定难以接受的。
拓展:深拷贝和浅拷贝
采用上面的方法进行拷贝的方法是一种浅拷贝的方式,其对象内部数组对象,引用对象都不拷贝,还是指向原生对象的内部元素地址,两个对象共享一个私有变量,是一种不安全的方式。
不会拷贝的情况:引用的成员变量必须满足两个条件才不会被拷贝(也即是大多数的东西都会被拷贝)
一:是类的成员变量,而不是方法内变量;二:必须是一个可变的引用对象,而不是一个原始类型或者不可变对象。(引自设计模式之禅)
在拷贝的时候只进行上面的拷贝的话是一个浅拷贝,如果手动加上没有赋值过去的地方,就可以达到深拷贝的标准。
有兴趣的同学可以去看看。
Six:适配器模式
适配器模式分为两种,第一种是对象的适配器模式,另外一种是类的适配器模式
对象的适配器模式
适配器模式肯定有三种角色 Target ,Adaptee和Adapter
package com.zcl.design.adapter.useObject;
public class Target {
// 目标角色有自己的方法
public void request(){
System.out.println("if you need any help ,call me ");
};
}
package com.zcl.design.adapter.useObject;
public class Adaptee {
//适配的方法
public void dosomething() {
System.out.println("leave me alone");
}
}
package com.zcl.design.adapter.useObject;
public class Adapter extends Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request() {
adaptee.dosomething();
}
}
我们可以看到的是Adapter适配器继承自Target类,并且覆盖了目标类的request(),然后在自己的内部维护了一个Adaptee对象,并且在request()函数中实现Adaptee类中的相应dosomething()函数。来实现相应的适配目的。
下面是Client类(测试类)
package com.zcl.design.adapter.useObject;
import com.zcl.design.adapter.useClass.Adapter;
public class Client {
public static void main(String[] args) {
Adapter adapter=new Adapter();
adapter.request();
}
}
类的适配器模式
类的适配器模式中跟对象的原理相同,只是实现是通过类之间的覆盖继承关系进行实现的。
Target接口
package com.zcl.design.adapter.useClass;
public interface Target {
// 目标角色有自己的方法
public void request();
}
具体目标类
package com.zcl.design.adapter.useClass;
public class ConcreteTarget implements Target {
//原有的业务逻辑
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("if you need any help ,call me ");
}
}
package com.zcl.design.adapter.useClass;
public class Adaptee {
public void dosomething() {
System.out.println("leave me alone");
}
}
最主要的是Adapter类
package com.zcl.design.adapter.useClass;
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
super.dosomething();
}
}
这个类是类的适配器模式的关键。这个类和具体目标类实现了同一个的接口,并且继承自Adaptee类。
有点头疼,先写到这,后来补上。