装饰模式

本文通过一个具体案例介绍装饰模式的应用及优势,重点分析了装饰模式如何提高代码的灵活性和可维护性,并以Struts2框架为例展示了装饰模式的实际运用。

在我们的项目中就遇到了问题,当时感觉如果应用了装饰模式的话,那么就不会这么麻烦了。

装饰模式的基本实现示意图如下:


原始接口:定义一个接口方法schoolReport;

默认目标实现类:对于原始接口的默认实现方式。也就是有待扩展的类FouthGradeSchoolReport。

装饰实现类:同样实现了原始接口,既可以是一个抽象类,也可以是一个具体实现类。其内部封装了一个原始接口的对象Decorator。

具体实现类:继承装饰类,可以选择性的覆盖实现装饰类中的方法,也可以添加自己的方法HighScoreDecorator。

那么会有人问,这和直接采用继承方式有什么不同呢?

我一开始也会有这样的疑问,后来仔细推敲发现,第一:适合对默认目标实现中的多个接口进行排列组合调度。第二:适合对默认目标实现进行选择性拓展。第三:默认目标实现未知或者不易拓展的情况。

也就是说,继承是单继承,而接口可以多继承。再就是极强的拓展性,如果你采用传统的继承,如果父类增加了一个方法,那么如果用很多子类,你要每一个子类都去实现这个方法,我靠那就真的疯了。相比之下,你的原始接口添加方法,只需要装饰类添加一个就可以,具体实现类可以不去添加,是不是轻巧了许多,哈哈。

下面是struts2中的装饰模式的使用:

public class OgnlValueStack implements Serializable, ValueStack, ClearableValueStack, MemberAccessValueStack {
//使用装饰模式,将根对象(栈结构)封装在ValueStack内部,从外界看来,所有的操作就像针对单一对象的操作,实际上在内部,实现了对栈的遍历 
CompoundRoot root;
//构造函数,这里将制定ognl计算时所需要的参数
 protected OgnlValueStack(XWorkConverter xworkConverter, CompoundRootAccessor accessor, TextProvider prov, boolean       allowStaticAccess) {
        //调用setRoot方法完成初始化
        setRoot(xworkConverter, accessor, new CompoundRoot(), allowStaticAccess);
        push(prov);
    }
 protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot,
                           boolean allowStaticMethodAccess) {
        this.root = compoundRoot;
//设定ognl所需要的MemeberAcccess实现类
        this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
//创建ognl的上下文
        this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);
        context.put(VALUE_STACK, this);
//设定ognl上下文所需的其他参数
        Ognl.setClassResolver(context, accessor);
        ((OgnlContext) context).setTraceEvaluations(false);
        ((OgnlContext) context).setKeepLastEvaluation(false);
    }


CompoundRoot源码:

public class CompoundRoot extends ArrayList {

    public CompoundRoot() {
    }

    public CompoundRoot(List list) {
        super(list);
    }


    public CompoundRoot cutStack(int index) {
        return new CompoundRoot(subList(index, size()));
    }

    public Object peek() {
        return get(0);
    }

    public Object pop() {
        return remove(0);
    }

    public void push(Object o) {
        add(0, o);
    }
}


可以看到继承了ArrayList,这里自己思考吧,ArrayLIst经过修改很容易成为一个栈结构实现“先进后出”。
 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值