实习之路0--设计模式之策略模式的理解(鸭子类例子)

     最近开始了解设计模式(headfirst系列),也是为了多读懂些代码。其中有几句话很是赞同,那就是软件开发后往往会花比开发更多的时间去维护,所以我们应该致力于软件的可维护性和可扩展性。所以设计模式就扮演了一个很重要的角色。

     继承对于许多初学者来说是个强大的武器,可以直接从父类获得所有的方法,也可以为我们的子类使用省略很多代码。但是这也是他的一个缺点,也就是说,你不可以选择性的继承指定的方法。试想对于一个鸭类,子类可能是绿头鸭(会飞会叫的那种)。那我可能会将“飞”和“叫”的方法直接写在父类,然后子类直接继承使用即可。但是当你添加了一种子类鸭,就比如玩具鸭(只会叫而不会飞),那么此时你可能想,那直接重写他的方法不就好了。那问题是,我如果再添加1种鸭的子类,那又要重写,那如果我添加100种呢。。。。。。

       这时我们就要考虑另一种做法了,那就是使用接口,比如Flyable(fly()方法)和Quackable(quack()方法)接口,终于不用代码重写了,但是又是另一个坑的开始,又要一遍遍地在子类实现接口。

        这时我们又有了新的想法,那就是能否将变化的部分和不变的部分分开。Flyable有两个实现类分别是Flynoway和Flywithwings两个实现类,Quackable也有两个实现类分别为Quack和Noquacking。然后我将Flyable和Quackable作为鸭Duck类的属性flyable和quackable,也就是组合啦。还有一个performFly(){ flyable.fly();}和performQuack(){quackable.quack();}接口用作属性可以进行解耦,也就是说我以后给这两个接口引用类型的值可以是两个任意的实现类。Duck子类继承后在自己的构造函数进行具体的赋值比如 flyable=new Flynoway(); quackable=new Quack();以后父类的fly(),quack(),方法也就是自己的方法了。这样的能够使得花费更少的时间完成有条理的代码。

代码如下:

public class Duck {
	
	protected Flyable flyable;
	protected Quackable quackable;
	
	public Duck() {
	}
	
	public void performFly() {
		flyable.fly();
	}
	public void performQuack(){
		quackable.quack();
	}
}


public interface Flyable {
	public void fly();

}

public class Flynoway implements Flyable {
	public void fly() {
		System.out.println("can't fly");
	}

}


public class Flywithwings implements Flyable {

	@Override
	public void fly() {
		System.out.println("can fly");
	}

}


public class Noquacking implements Quackable {

	@Override
	public void quack() {
		System.out.println("can't quack");
	}

}


public class Quack implements Quackable{

	@Override
	public void quack() {
		System.out.println("can quack");	
	}
}

public interface Quackable {
	public void quack();
}


public class Modelduck extends Duck{
	
	public Modelduck() {
		this.flyable = new Flynoway();
		this.quackable = new Quack();
	}

}

public class Test {
	public static void main(String [] args) { 
		
		Duck modelduck = new Modelduck();
		modelduck.performFly();
		modelduck.performQuack();
	}

}

运行结果:


     以上只是个人观点,欢迎指正。

                                                                                                                                                                                     --麦子


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值