设计模式之装饰模式



装饰模式 (Decorator) (包装模式Wrapper)


定义:
动态的给对象添加一些额外的功能(比继承更加灵活)
人靠衣装,佛靠金装
透明的给对象增加功能


功能组合
为什么装饰类需要继承被装饰类,因为装饰类还可以再一次被装饰


角色
Component 抽象组件,被装饰的原始对象
ConcreteComponent 组件的具体实现,被装饰的具体对象
Decorator 抽象装饰者(1.继承于Component 2.持有被装饰对象的引用)
ConcreteDecorator 具体的装饰实现


装修墙


奖金计算简化
每个人当月业务奖金 = 当月销售额 * 3%
每个人累计奖金 = 总的回款额 * 0.1%
团队奖金 = 团队总销售额 * 1%


计算方式要经常变动


给计算奖金对象,灵活的增加功能,动态的组合功能


IO


//IO
//读文本一个字符字符读取,读视频数据一个字节读取
//字符流,字节流
//通过字节流读取一个一个的字符?让字节流具备读取字符的功能
try {
File file = new File("a.txt");
FileInputStream in = new FileInputStream(file);
//读取字符,装饰对象增加读取字符的功能
//reader 装饰对象
InputStreamReader reader = new InputStreamReader(in);
//char ch = (char)reader.read();
//继续增加功能,一行行读取
BufferedReader br = new BufferedReader(reader);
br.readLine();

} catch (Exception e) {
e.printStackTrace();
}


本质:动态组合


优点:
比继承灵活(原则:尽量使用对象组合而不是继承)
简化高层定义


缺点:会产生很多细粒度的对象


场景:动态透明的给对象添加功能(功能组合),不适合通过继承添加功能


相关代码:


被装饰者接口类:

/**
 * 人,抽象的组件类 
 * @date 2016年2月20日 
 */
public abstract class Person {

	/**
	 * 抽象的穿衣方法
	 */
	public abstract void dressed();
	
}

/**
 * 男孩,具体的被装饰的类 
 * @date 2016年2月20日 
 */
public class Boy extends Person{

	@Override
	public void dressed() {
		System.out.println("穿了内衣内裤");
	}

}

装饰者接口类:
/**
 * 衣服,抽象的装饰类 
 * @date 2016年2月20日 
 */
public abstract class Cloth extends Person {
	private Person p;

	public Cloth(Person p) {
		super();
		this.p = p;
	}
	
	@Override
	public void dressed() {
		p.dressed();
	}

}

/**
 * 便宜衣服 
 * @date 2016年2月20日 
 */
public class CheapCloth extends Cloth {

	public CheapCloth(Person p) {
		super(p);
	}

	@Override
	public void dressed() {
		super.dressed();
		dressShorts();
	}
	
	private void dressShorts(){
		System.out.println("穿条短裤");
	}
}

/**
 * 贵的衣服,具体的装饰类 
 * @date 2016年2月20日 
 */
public class ExpensiveCloth extends Cloth {

	public ExpensiveCloth(Person p) {
		super(p);
	}
	
	@Override
	public void dressed() {
		super.dressed();
		dressShirt();
		dressJean();
	}
	
	private void dressShirt(){
		System.out.println("穿件短袖");
	}
	
	private void dressJean(){
		System.out.println("穿件牛仔裤");
	}

}

代码调用:

public class Client {

	public static void main(String[] args) {
		//被装饰对象,男孩
		Boy boy = new Boy();
		
		//装饰对象,贵的衣服
		ExpensiveCloth c2 = new ExpensiveCloth(boy);
		
		//装饰对象,便宜的衣服
		CheapCloth c1 = new CheapCloth(c2);
		//c1.dressed();
	
		c1.dressed();  
	} 
}

调用结果:

穿了内衣内裤
穿件短袖
穿件牛仔裤
穿条短裤


整理自教程



内容概要:本文系统介绍了算术优化算法(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、付费专栏及课程。

余额充值