设计模式学习(一)---Stratage

 首先来看个例子,

public class duck{

public void fly(){

}

public void quack(){

}

public abstract void desc(){

}

}

这是我一般设计的duck class用来描述一般的duck,一些其他的duck可以extend this

eg  public class GreenHeadDuck{

public void desc(){

System.out.println("I have green head");

}

//继承了duck中的fly和quack方法(也是duck的行为)而在desc()中添加了自己的描述

但是并不是每个duck的子类都能进行fly和quack的行为,怎么办???

我第一想到的是:继承的方法中什么都不写就行了嘛!!

public void fly() {

//I can't fly

}

但是,一旦这样每写一个不能fly 的duck就要覆盖一遍,而且并不是所有的duck的quack行为是一致的怎么办??

我想的是:那就每个覆盖一遍

这简直是疯了!!!!I'm out of my mind 这样要做多少effort

 

这里碰到的情况可以这样来说: 我想要抽象,这是OO要求的,但是对于复杂多变的情况没有很好的解决

怎么办?????

OO第一个原则:

抽象出变化的部分,使之与不变的部分分开

解决之道: 将变化的行为抽象成接口,为什么是接口而不是类

OO第二个原则:

面向接口编程,而不是实现

 

那么是否只要有这个行为的方法实现这个接口就行了呢 ??

开始想象好像是,但是仔细一想就不行了,你一个duck有多少行为,难道都要实现不是烦死了

那怎么办??

组合是解决的方法

将行为组合进duck中

public class GreenHeadDuck extends duck{

FlyBeavhier fly;

QuackBeavhier quack;

public void desc(){

}

}

现在我只要写一些fly的不同的行为

即一系列实现FlyBeavhier的类,用来描述不同duck的fly行为

而且这些行为可以动态的改变(接口实现的,set方法就可以了)

多用组合而不是继承来复用是OO 的第三个原则

 

这里可以总结策略模式了:

策略模式就是将一系列的行为,实现行为的算法簇,将行为接口组合进对象中,并可动态改变


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值