博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
head设计模式 01
阅读量:6837 次
发布时间:2019-06-26

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

- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起

  换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分代码需要被抽出来,和其他稳定的代码有区别。例如例子中的鸭子会飞 fly()方法,就需要独立出来。(把会变化的部分取出来并封装起来,以便以后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分)

- 针对接口编程,而不是针对实现编程

  委托(delegate)

 

- 设计模式

- 例子及总结

  问题描述:

 

现在想让鸭子能飞,该如何设计,如果只是在Duck这个类里增加飞的方法,不好,因为继承的子类里有的是玩具鸭子不能飞,如果是单独定义的接口,也不好,每个类实现接口的时候都需要每个都重新编码,飞的方法可能是固定的就那么1-2种,如果每个类都需要重新实现是不好的方法。那么怎么办呢?

将变化的方法抽象出来,比如飞和叫,然后再定义两个单独的类来实现该接口,那然后把这两个类作为自己的实例变量来实现。

- 例子分析

  目前我们有一套关于鸭子的游戏,有一个super class Duck, 如下图: 现在… boss说要鸭子可以飞。。。怎么办呢?(要求代码尽量少,并尽量满足oop), 我们知道,最好就是能够“一劳永逸”, 而且满足可复用,就是说,当再有新的方法添加时,比如鸭子可以”泡妞“,对别的不产生影响。

办法1: 在super class 中直接添加 fly()方法, 一劳永逸+可复用都满足,但是。。不满足逻辑,比如,水中的玩具鸭子,它能飞? 它是不可以飞的。即该子类不能继承这个方法。(此处你也可以在不能飞的子类继承时不实现fly()方法,但是,这不是结构在限制你,而是人为限制,人为的行为,就很有可能出现错误)

办法2: 定义一个fly接口,让可以飞的鸭子实现该接口,逻辑上过的去,该飞的可以飞,不该飞的不实现该接口就可以了。也可复用,但是不能做到一劳永逸,因为所有实现该接口的类必须完成该方法,而fly()方法是比较固定的,”煽动翅膀就可以飞了“。 要在每个实现该接口的子类里都定义一般”飞“,很多重复代码。

办法3:

UML: 类图

code:

Duck-Duck/** * File: SouckBehavior.java * ---------------------------------- * Do the sock job interface * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:52 */public interface SouckBehavior {	public void sock();}/** * File: FlyBehavior.java * -------------------------------------- * Do the fly job interface * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:46 */public interface FlyBehavior {	public void fly();}/** * File: SocuSilence.java * ------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:51 */public class SockSilence implements SouckBehavior {	public SockSilence(){	}	public void finalize() throws Throwable {	}	public void sock(){		System.out.println("I am sorry, i can't sock.");	}}/** * File: SockLow.java * ------------------------ * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:50 */public class SockLow implements SouckBehavior {	public SockLow(){	}	public void finalize() throws Throwable {	}	public void sock(){		System.out.println("I can sock, low, ^_^");	}}/** * File: SockHigh.java * ---------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:50 */public class SockHigh implements SouckBehavior {	public SockHigh(){	}	public void finalize() throws Throwable {	}	public void sock(){		System.out.println("I can sock, High, ^+^.");	}}/** * File: FlyOk.java * ------------------------------ * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:48 */public class FlyOk implements FlyBehavior {	public FlyOk(){	}	public void finalize() throws Throwable {	}	public void fly(){		System.out.println("As you know, I can fly.");	}}/** * File: FlyNg.java * --------------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:47 */public class FlyNg implements FlyBehavior {	public FlyNg(){			}	public void finalize() throws Throwable {	}	public void fly(){		System.out.println("I am sorry, I can not fly.");	}}/** * File: SockDuck.java * ------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:49 */public class SockDuck extends Duck {	public SockDuck(){		flyBehavior = new FlyNg();		sockBehavior = new SockHigh();	}	public void finalize() throws Throwable {		super.finalize();	}	public void display(){		System.out.println("I am a sock duck, I can sock high.");	}}/** * File: NowayDuck.java * --------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:49 */public class NowayDuck extends Duck {	public NowayDuck(){		flyBehavior = new FlyNg();		sockBehavior = new SockSilence();	}	public void finalize() throws Throwable {		super.finalize();	}	public void display(){		System.out.println("I am a No way duck, i can do nothing.");	}}/** * File: FlyDuck.java * ------------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:46 */public class FlyDuck extends Duck {	public FlyDuck(){		flyBehavior = new FlyOk();		sockBehavior = new SockSilence();	}	public void finalize() throws Throwable {		super.finalize();	}	public void display(){		System.out.println("I am a fly duck, So i can fly only.");	}}/** * File: FlyAndSockDuck.java * --------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:45 */public class FlyAndSockDuck extends Duck {	public FlyAndSockDuck(){		flyBehavior = new FlyOk();		sockBehavior = new SockLow();	}	public void finalize() throws Throwable {		super.finalize();	}	public void display(){		System.out.println("I am a Fly and Sock duck, Fly And Sock, i can do it!");	}}/** * File: Duck.java * -------------------------------- * @author Leon * @version 1.0 * @created 15-五月-2013 14:16:44 */public abstract class Duck {	protected FlyBehavior flyBehavior;	protected SouckBehavior sockBehavior;	public Duck(){	}	public void finalize() throws Throwable {	}	public abstract void display();	public void flyMethod(){		flyBehavior.fly();	}	/**	 * 	 * @param fb	 */	public void setFlyBehavior(FlyBehavior fb){		flyBehavior = fb;	}	/**	 * 	 * @param sb	 */	public void setSockBehavior(SouckBehavior sb){		sockBehavior = sb;	}	public void sockMethod(){		sockBehavior.sock();	}	public void swim(){		System.out.println("I am swimming ! ");	}}/* * File: TestDuck.java * ------------------------------- * Test class for the duck. */  public class TestDuck { 	public static void main(String[] args) { 		/* 		FlyDuck du = new FlyDuck(); 		du.setSockBehavior(new SockHigh()); 		du.flyMethod(); 		du.sockMethod(); 		*/ 		FlyAndSockDuck dus = new FlyAndSockDuck(); 		dus.flyMethod(); 		dus.sockMethod(); 		dus.setFlyBehavior(new FlyNg()); 		dus.setSockBehavior(new SockSilence()); 		dus.flyMethod(); 		dus.sockMethod(); 	} }

 

你可能感兴趣的文章
gitshell 基础操作
查看>>
HDU 1517 A Multiplication Game 博弈
查看>>
调整字符串日期的格式
查看>>
paramiko多线程远程执行命令
查看>>
vue-computed计算属性用法
查看>>
mysql学习笔记-day1
查看>>
Atcoder Beginner Contest 118 D-Match Matching(完全背包)
查看>>
Webapi创建和使用 以及填坑(三)
查看>>
oracle-sql系统学习-ddl-dml
查看>>
java创建文件写入内容,并实现下载该文件
查看>>
C# Graphics 字体倒置
查看>>
Cisco Easy ***综合配置示例
查看>>
18岁的他从月薪2000到月薪11000经历了什么?
查看>>
Cloud Service Process Pack
查看>>
rsync应用拓展多模块同步13
查看>>
FreeBSD下安装配置Hadoop集群(一)
查看>>
组合问题的求解
查看>>
zabbix专题:第十二章 zabbix proxy分布式监控配置
查看>>
为什么总觉得自己不适合搞IT?
查看>>
vmware克隆server2008R2造成SID冲突
查看>>