目标:鸭子有不一样种类,会不一样的叫法和飞法,都会游泳,能够显示。能动态改变叫法和飞法 算法
public interface FlyBehaviour {
void fly();
} ide
-------------------------------------- this
public interface QuackBehaviour {
void quack();
} orm
---------------------------------------- 继承
public class Duck {
FlyBehaviour flyBehaviour;
QuackBehaviour quackBehaviour;
void performFly(){
flyBehaviour.fly();
}
void performQuack(){
quackBehaviour.quack();
}
void display(){
System.out.println("I'm a duck");
}
}
------------------------------------- 接口
public class FlyWithWing implements FlyBehaviour {
@Override
public void fly(){
System.out.println("fly with wing");
}
}
------------------------------------------ it
public class Quack implements QuackBehaviour{
@Override
public void quack() {
System.out.println("Quack, quack, quack !");
} io
} form
------------------------------------------------ class
public class MallarDuck extends Duck {
public MallarDuck(){
this.flyBehaviour=new FlyWithWing();
this.quackBehaviour=new Quack();
}
void display(){
System.out.println("I'm a mallar duck");
}
}
----------------------------------------------
public class Farm {
public void Farm(){
}
/**
* @param args
*/
public static void main(String[] args) {
Duck duck=new MallarDuck();
duck.display();
duck.performFly();
duck.performQuack();
}
}
===========================
result:
I'm a mallar duck
fly with wing
Quack, quack, quack !
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
让不一样的鸭子会叫会飞,把具体行为的实现抽离出超类,行为做为接口变量存在于超类中,超类不需理会其行为的不一样。
多用组合,少用继承
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
改进:动态改变鸭子行为
public class Duck {
FlyBehaviour flyBehaviour;
QuackBehaviour quackBehaviour;
void performFly(){
flyBehaviour.fly();
}
void performQuack(){
quackBehaviour.quack();
}
void display(){
System.out.println("I'm a duck");
}
void swim(){
System.out.println("I can swim ,'cause I'm a duck");
}
//can change behavior!
public void setFlyBehaviour(FlyBehaviour flyBehaviour) {
this.flyBehaviour = flyBehaviour;
}
public void setQuackBehaviour(QuackBehaviour quackBehaviour) {
this.quackBehaviour = quackBehaviour;
}
}
-------------------------------------------------------------------
public class DuckModule extends Duck {
public DuckModule(){
flyBehaviour=new FlyNoWay();
quackBehaviour=new Quack();
}
public void display(){
System.out.println("I'm a module duck");
}
}
----------------------------------------------------------
public class FlyNoWay implements FlyBehaviour{
@Override
public void fly() {
//Unable to fly
System.out.println("I can't fly");
}
}
-----------------------------------------------------------
public class FlyRocketPowered implements FlyBehaviour{
@Override
public void fly() {
System.out.println("I'm flying with a rocket!");
}
}
-------------------------------------------------------
public class Farm {
public void Farm(){
}
/**
* @param args
*/
public static void main(String[] args) {
Duck moduleDuck=new DuckModule();
moduleDuck.display();
moduleDuck.performFly();
moduleDuck.performQuack();
moduleDuck.setFlyBehaviour(new FlyRocketPowered());
moduleDuck.performFly();
}
}
=============================
result:
I'm a module duck
I can't fly
Quack, quack, quack !
I'm flying with a rocket!
==============================
策略模式(Strategy Pattern)定义了算法族,分别封装起来,让他们之间能够互相替换,此模式让算法的变化独立于使用算法的客户