装饰器模式和代理模式
1、装饰器模式:动态地给一个对象添加一些额外的职责。重点是调用者主动给目标对象动态新增功能
2、代理模式:为其他对象提供一种代理以控制对这个对象的访问。重点是调用者不用知道目标对象是什么,是怎么创建的,只需要告诉代理对象自己需要什么。
实现方式:
a、装饰器模式:
1、新增一个接口,接口就一个方法表示要向数据库插入数据
public interface DB { /** * 向数据库中插入一个记录 * @param value */ void insert(String value); }
2、新增一个实现类,表示向具体的MySql这个数据库中插入数据
/** * 模拟向MySql数据库中插入数据 */ public class MySqlDB implements DB { @Override public void insert(String value) { System.out.println(String.format("inset value(%s) into MySqlDB ",value)); } }
3、新增一个装饰器,表示在向数据库中插入数据的过程中提供事务的处理能力
/** * 模拟在往数据库中插入数据的时候开启事务功能 */ public class TranslationDB implements DB { DB db; public TranslationDB(DB db){ this.db=db; } @Override public void insert(String value) { System.out.println("打开事务"); db.insert(value); System.out.println("提交事务"); } }
4、测试:
DB db=new MySqlDB(); DB transdb=new TranslationDB(db); //调用者动态给目标对象db装饰一个开启事务的功能 transdb.insert("zhangsan");
b、代理模式:
1、新增一个服务接口表示插入一个数据
public interface Service { /** * 插入数据的服务 * @param value */ void insert(String value); }
2、新增一个具体的实现类来实现插入数据的服务
/** * 模拟一个远程服务提供者 */ public class RemoteService implements Service { @Override public void insert(String value) { System.out.println(String.format("调用远程服务插入数据:%s",value)); } }
3、新增一个代理类,模拟远程调用
/** * 模拟一个调用远程服务的代理类 */ public class ProxyService implements Service { Service service; public ProxyService(){ service=new RemoteService(); } @Override public void insert(String value) { service.insert(value); } }
4、测试
Service service=new RemoteService(); //调用者通过代理类调用目标服务提供者提供的服务 service.insert("zhangsan");
总结:从上面两个简单的装饰器模式和代理模式的实现方式来看,两者的实现方式基本相同,不同的地方就是装饰器模式在调用者来看,是要由调用者主动创建被装饰的对象,装饰器是用来给被装饰的对象额外新增一些其他功能。而代理模式在调用者来看是不关心被代理的对象是什么,调用者只需要告诉代理者他需要什么服务,具体服务是怎么提供的他不关心,由代理者去管理。