结构模式(二)
Proxy(代理)
为其他对象提供一种代理以控制对这个对象的访问。
代理模式主要分两种:
一种是静态代理,代理和被代理对象在代理之前是确定的
一种是动态代理,被代理对象在代理之前是未知的
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
使用场景
1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。
2.虚代理(VirtualProxy)根据需要创建开销很大的对象。
3.保护代理(ProtectionProxy)控制对原始对象的访问。
4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。
主要参与者
Proxy
一个可用作代理的实体,以便可以实现对具体对象的访问及相应控制
public class ProxyObject implements Object {
Object obj;
public void action() {
//访问具体实体
obj.action();
}
}
Subject
提供给具体实体和代理的公共接口,以实现代理
public interface Object {
void action();
}
RealSubject
Proxy所代表的实体。
public class ObjectImpl implements Object {
public void action() {
// TODO 具体实体的实现
}
}
测试
public class Test { public static void main() { Object obj = new ProxyObject(); obj.action(); } }
Flyweight(共享元)
避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
使用场景
应用程序使用了大量的对象
参与者
Flyweight
描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
public interface Flyweight {
void action(int arg);
}
ConcreteFlyweight
实现Flyweight接口,并为内部状态增加存储空间。
ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。
public class FlyweightImpl implements Flyweight {
public void action(int arg) {
// TODO Auto-generated method stub
}
}
UnsharedConcreteFlyweight
并非所有的Flyweight子类都需要被共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
FlyweightFactory
创建并管理flyweight对象, 确保合理地共享flyweight。
public class FlyweightFactory {
private static Map flyweights = new HashMap();
public static synchronized Flyweight getFlyweight(String key) {
if (flyweights.get(key) == null) {
flyweights.put(key, new FlyweightImpl());
}
return flyweights.get(key);
}
public static int getSize() {
return flyweights.size();
}
}
Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度