一、设计原则
1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程。
3、多用组合,少用继承。
4、为交互对象之间的松耦合设计而努力
5、开放-关闭原则:类应该对扩展开放,对修改关闭
二、设计模式
1、策略模式
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实例:模拟鸭子
最初采用OO技术,设计一个鸭子的超类,并让各种鸭子继承此超类,后采用继承,因为鸭子的行为在子类里不断的改变,并且让所有的子类都有这些行为是不恰当的,用接口一开始好像挺不错,但接口不具有实现代码,所以继承接口无法达到代码的复用。
采用策略模式设计该功能,代码如下:
/**
*
*设计一个飞行行为接口,所有飞行行为类必须实现的方法
*
*/
public interface FlyBehavior {
public void fly();
}
/**
*
* 飞行行为的实现,给会飞的鸭子使用
*
*/
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("i am flying!!!");
}
}
/**
*
* 飞行行为的实现,给不会飞的鸭子使用
*
*/
public class FlyNoway implements FlyBehavior{
@Override
public void fly() {
System.out.println("i cannot fly!!");
}
}
/**
*
*设计一个叫声行为接口,所有叫行为类必须实现的方法
*
*/
public interface QuackBehavior {
public void quack();
}
/**
*
* 给呱呱叫的鸭子使用
*
*/
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("呱呱呱。。。");
}
}
/**
*
* 给吱吱叫的鸭子使用
*
*/
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
System.out.println("吱吱吱。。。");
}
}
/**
*
* 给不会叫的鸭子使用
*
*/
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("不会叫。。。");
}
}
/**
*
* 鸭子父类
*
*/
public abstract class Duck {
//为行为接口类型声明两个引用变量,所有鸭子类都继承他们
//飞行行为类
FlyBehavior flyBehavior;
//叫声行为类
QuackBehavior quackBehavior;
public abstract void display();
//委托给行为类
public void performFly(){
flyBehavior.fly();
}
//委托给行为类
public void performQuack(){
quackBehavior.quack();
}
public void swim(){
System.out.println("i can swimming!!!");
}
}
/**
*
* 绿头鸭子类
*
*/
public class MallardDuck extends Duck{
public MallardDuck(){
//绿头鸭使用Quack类处理呱呱叫,所以当performQuack()被调用时,
//叫的职责被委托给Quack对象,而我们得到了真正的呱呱叫
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("我是绿头鸭!!");
}
}
至此一个策略模式实例已经结束,下一篇将学习下观察者模式!!