head设计模式 01

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

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

image

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

  委托(delegate)

  image

image

image

image

image

image

image

image

image

- 设计模式

image

- 例子及总结

  问题描述:

image 

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

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

- 例子分析

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

image

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

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

办法3:

UML: 类图

image

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();
 	}
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值