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");

总结:从上面两个简单的装饰器模式和代理模式的实现方式来看,两者的实现方式基本相同,不同的地方就是装饰器模式在调用者来看,是要由调用者主动创建被装饰的对象,装饰器是用来给被装饰的对象额外新增一些其他功能。而代理模式在调用者来看是不关心被代理的对象是什么,调用者只需要告诉代理者他需要什么服务,具体服务是怎么提供的他不关心,由代理者去管理。
这篇博客探讨了装饰器模式和代理模式的概念及实现。装饰器模式着重于动态地给对象添加额外职责,调用者主动进行功能增强;而代理模式关注于控制对象访问,调用者只需告诉代理其需求,代理负责管理和实现具体服务。两者在实现上类似,但应用场景和调用者视角有所不同。
792

被折叠的 条评论
为什么被折叠?



