策略模式(headfirst设计模式学习笔记)
发布日期:2021-10-18 18:51:22 浏览次数:1 分类:技术文章

本文共 3100 字,大约阅读时间需要 10 分钟。

鸭子的行为被封装 进入一组类中,可以轻易的扩展和改变,如果需要可以运行时改变行为!

策略模式定义了算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户。

继承,相似之处用继承,假如如干个功能点需要修改,代码难以维护,

原始代码

public  class Duck {	//鸭子描述	 public  void dispaly(){		 System.out.println("描述");	 }	 	 	//鸭子叫	 public void quack(){		 System.out.println("会叫");	 }	 	}
public class MallarDuck extends Duck{	public static void main(String[] args)  {		Duck duck=new Duck();		duck.dispaly();		duck.fly();		duck.quack();	}}

假如Duck要添加新的行为鸭子飞,那代码难以维护,比如有的鸭子会飞有的不会飞。

假如继承或者实现接口,这二种都依赖于实现,我们会被绑的死死的,没有办法更改更多行为。

接口,针对接口编程,而不是针对实现编程,需要修改干个功能点使用接口,实现方式灵活多变。

更改后代码:

package com.base;import com.interfaces.FlyBehavior;import com.interfaces.QuackBehavior;/** * 将大功能点分为接口小模块,接口为了小功能点有弹性, * @author Hadoop * */public abstract class Duck {	protected FlyBehavior flyBehavior;	 protected QuackBehavior quackBehavior;	 	 public void setFlyBehavior(FlyBehavior flyBehavior){		 this.flyBehavior=flyBehavior;	 }	 public void QuackBehavior(QuackBehavior quackBehavior){		 this.quackBehavior=quackBehavior;	 }	 	 public abstract void dispaly();//鸭子描述	 	 /**	  * 委托给行为类	  */	 public void performFly(){//鸭子飞		 flyBehavior.fly();	 }	 public void performQuack(){//鸭子叫		 quackBehavior.quack();	 }	 	}
package com.interfaces;/** * 行为类(飞) * @author Hadoop * */public interface FlyBehavior {	void fly();}
package com.interfaces;/** * 鸭子叫 * @author Hadoop * */public interface QuackBehavior {	void quack();}
package com.interfaces.impl;import com.interfaces.FlyBehavior;public class FlyNoWay implements FlyBehavior {	public void fly() {		System.out.println("鸭子不会飞行");	}}
package com.interfaces.impl;import com.interfaces.FlyBehavior;public class FlyRocketPowered implements FlyBehavior {	public void fly() {		// TODO Auto-generated method stub		System.out.println("助力器");	}}
package com.interfaces.impl;import com.interfaces.FlyBehavior;public class FlyWithWings implements FlyBehavior {	public void fly() {		System.out.println("鸭子飞行");	}}
package com.interfaces.impl;import com.interfaces.QuackBehavior;public class Quack implements QuackBehavior {	public void quack() {		// TODO Auto-generated method stub		System.out.println("橡皮鸭子叫");	}}
package com.interfaces.impl;import com.interfaces.QuackBehavior;public class Squack implements QuackBehavior {	public void quack() {		// TODO Auto-generated method stub		System.out.println("鸭子叫");	}}
具体鸭子

package com;import com.base.Duck;import com.interfaces.impl.FlyNoWay;import com.interfaces.impl.FlyWithWings;import com.interfaces.impl.Quack;public class MallarDuck extends Duck{	public MallarDuck(){		quackBehavior=new Quack();		flyBehavior=new FlyNoWay();	}	public void dispaly() {		System.out.println("描述");	}}
import java.io.IOException;import com.MallarDuck;import com.interfaces.impl.FlyRocketPowered;public class test {	/**	 * @param args	 * @throws IOException 	 */	public static void main(String[] args) throws IOException {		MallarDuck mallarDuck=new MallarDuck();		mallarDuck.dispaly();		mallarDuck.setFlyBehavior(new FlyRocketPowered());		mallarDuck.performFly();		mallarDuck.performQuack();			}}
设计原则:多用组合,少用继承组合建立系统有很大弹性,不仅可以将算法分类,而且可以动态的改变行为, 只要组合行为对象符合正确的接口标本即可。

转载地址:https://blog.csdn.net/u011153869/article/details/38118921 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux基础指令
下一篇:不同的寻址方式灵活运用(di,si)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月02日 09时49分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc 2019-04-21
java中的无效的列类型_java.sql.SQLException: 无效的列类型: 1111 2019-04-21
php rewrite url_PHP_URL Rewrite的设置方法,URL Rewrite需要服务器的支持! - phpStudy 2019-04-21
php读取大文件某行内容,PHP读取和修改大文件的某行内容_PHP教程 2019-04-21
打印php错误日志,php怎样打印错误日志 2019-04-21
Calendar导入java,Java程序使用Calendar.add()方法将分钟添加到当前时间 2019-04-21
mysql中用户线程作用,mysql用户线程的建立与用户线程的状态源码解析 2019-04-21
php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件 2019-04-21
php tracy,admin.php 2019-04-21
php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性 2019-04-21
oracle比较强大的函数,SQL和ORACLE函数比较 2019-04-21
oracle12c order by,oracle 数据库中order by 的一些高级用法 2019-04-21
oracle8i substr,Oracle中的INSTR,NVL和SUBSTR函数的用法详解 2019-04-21
导出oracle11g的空表,轻松解决oracle11g 空表不能 exp 导出 的问题。 2019-04-21
php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理 2019-04-21
oracle numlist,oracle sql str2numlist numtabletype 2019-04-21
php红包平均分配,红包平均分配算法 2019-04-21
linux磁盘的命令是,linux磁盘相关的命令 2019-04-21
linux 停用用户,linux – 如何禁用用户的网络访问? 2019-04-21
linux服务器 缓存,Linux服务器内存使用分析及内存缓存 2019-04-21