装饰器模式和代理模式

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

总结:从上面两个简单的装饰器模式和代理模式的实现方式来看,两者的实现方式基本相同,不同的地方就是装饰器模式在调用者来看,是要由调用者主动创建被装饰的对象,装饰器是用来给被装饰的对象额外新增一些其他功能。而代理模式在调用者来看是不关心被代理的对象是什么,调用者只需要告诉代理者他需要什么服务,具体服务是怎么提供的他不关心,由代理者去管理。

经验分享 程序员 微信小程序 职场和发展