重新认识装饰模式--装饰模式实现AOP

本文探讨了AOP(面向方面编程)的概念及其在系统开发中的作用,强调了AOP如何减少重复代码并提高模块独立性。通过装饰模式与AOP的比较,展示了装饰模式如何动态组合以实现AOP功能。文中给出了一个使用Java实现的装饰模式示例,用于权限控制和日志记录,以说明装饰模式在实现AOP方面的应用。
摘要由CSDN通过智能技术生成
一、AOP是什么
AOP:面向方面编程,他是一种编程范式,提供从另外一个角度来考虑程序结构以完善面向对象编程。
二、AOP的功能
      在系统开发过程中会有一些共性的功能,这是面向对象的纵向思考方式就能解决问题了,这时候AOP横向延伸就可以解决这些公共服务织入系统中。AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,比如事务处理、日志处理、权限控制封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
      按照装饰模式对比上述过程,业务功能对象就可以被看做被装饰的对象,而各个公共的模块就好比是装饰器,可以透明地给业务功能对象增加功能。
      所以从某个侧面来说,装饰模式和AOP要实现的功能相似,只不过AOP的实现方法不同,会更加灵活,更加可配置,另外AOP一个更加重要的变化时思想上的变化----主从换位,让原本主动调用的功能模块变成了被动等待,甚至在毫不知情的情况下被织入很多新的功能。
三、用装饰实现AOP:
package itcast.test.decorator;
/**
 * 装饰器的接口,需要和被装饰的对象实现同样的接口*/
public abstract class Dercorator implements GoodsSaleEbi {
    /**
     * 持有被装饰的组件对象*/
    protected GoodsSaleEbi ebi;
    /**
     * 通过构造方法传入被装饰对象
     * @prara, ebi被装饰的对象*/
    public Dercorator(GoodsSaleEbi ebi){
        this.ebi=ebi;
    }
}
package itcast.test.decorator;
public class CheckDecorator extends Dercorator{
    /**
     * 实现权限控制*/
    public CheckDecorator(GoodsSaleEbi ebi){
        super(ebi);
    }
    
    public boolean sale(String user,String customer,SaleModel saleModel){
        
        //简单点儿,只让张三执行这个功能
        if(!"张三".equals(user)){
            System.out.println("对不起"+user+",你没有保存销售单的权限");
            //就不用再调用被装饰的对象的功能了
            return false;
        }else{
            return this.ebi.sale(user,customer,saleModel);
        }
    }
}
package itcast.test.decorator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogDercorator extends Dercorator{
    public LogDercorator(GoodsSaleEbi ebi){
        super(ebi);
    }
    public boolean sale(String user,String customer,SaleModel saleModel){
        //执行业务功能
        boolean f= this.ebi.sale(user, customer, saleModel);
        //执行业务功能后记录日志
        DateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        
        System.out.println("日志记录:"+user+"于"+df.format(new Date())+"时保存了一条销售记录,客户是"+customer+",购买记录是"+saleModel);
        
        return f;
    }
}
package itcast.test.decorator;
//商品销售管理的业务接口
public interface GoodsSaleEbi {
    /* * 保存销售信息
     * @param customer 客户
     * @param saleModel 销售数据
     * @return 是否保存成功*/
    public boolean sale(String user,String customer,SaleModel saleModel);
}
package itcast.test.decorator;
public class GoodsSaleEbo implements GoodsSaleEbi {
    @Override
    public boolean sale(String user, String customer, SaleModel saleModel) {
        System.out.println(user+"保存了"+customer+"购买"+saleModel+"的销售数据");
        return true;
    }
}
package itcast.test.decorator;
/**
 * 封装好的销售单数据对象*/
public class SaleModel {
    private String goods;
    private int saleNum;
    public String getGoods() {
        return goods;
    }
    public void setGoods(String goods) {
        this.goods = goods;
    }
    public int getSaleNum() {
        return saleNum;
    }
    public void setSaleNum(int saleNum) {
        this.saleNum = saleNum;
    }
    
    public String toString(){
        return "商品名称="+goods+",购买数量="+saleNum;
    }
    
}
package itcast.test.decorator;
public class Client {
    public static void main(String[] args){
        //得到业务接口,组合装饰器
        GoodsSaleEbi ebi = new CheckDecorator(new LogDercorator(new GoodsSaleEbo()));
        /*准备测试数据*/
        SaleModel saleModel= new SaleModel();
        saleModel.setGoods("MoTo 手机");
        saleModel.setSaleNum(2);
        
        //调用和业务功能
        ebi.sale("张三", "张三丰", saleModel);
        ebi.sale("李四", "张三丰", saleModel);
        
    }
}
运行结果:

四、分析
      装饰可以实现AOP的功能,同时也可以实现关于任何的组合的方式,那么现在我们能够看出,装饰模式的本质有两点:动态+组合,也就是说装饰模式可以动态组合出任何的功能,把这些功能给我们的业务功能做外层包装,这样也就实现了AOP的功能。装饰模式比继承更灵活,更加容易复用功能,并且可以简化对于高层的定义。但是有上述代码中我们可以看出产生了很多细粒度的对象,例如LogDercorator、GoodsSaleEbo等,当功能越复杂的时候,需要的细粒度的对象越多。

   实例的源码地址:http://download.csdn.net/detail/wangdan1030/9535406



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值