基于java的设计模式(1)------策略模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lys1695227550/article/details/78311452
文章只是自己在极客学院学习设计模式过程中的一些笔记,便于以后查看

 背景:

在面向对象编程中,使用继承时扩展性问题,如果某个对象的方法增加,在超类添加方法,则其下的子类都继承了这个方法,影响范围太大,出现溢出效应。超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式  

解决:

使用策略模式,抽出变化的部分,抽象成接口+实现,就可以在超类里放行为接口对象,在子类里具体设 定行为对象

原则就是:分离变化部分,封装接口,基于接口编程各种功能。这个模式让行为算法的变化独立于算法的使用。

给出demo:

package duck;

import strategy_pattern.behavior.FlyBehavior;
import strategy_pattern.behavior.QuackBehavior;

public abstract class duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	public duck() {

	}

	public void Fly() {
		flyBehavior.fly();
	}

	public void Quack() {
		quackBehavior.quack();
	}

	public abstract void display();

	public void swim() {
		System.out.println("~~im swim~~");
	}

	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}


	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
	
	
}
package duck;

import strategy_pattern.behavior_detial.GaGaQuackBehavior;
import strategy_pattern.behavior_detial.GodeFlyBehavior;

public class GreenDuck extends duck {

	
	public  GreenDuck() {
		flyBehavior=new GodeFlyBehavior();
		quackBehavior=new GaGaQuackBehavior();
	}
	
	@Override
	public void display() {
		System.out.println("-------greenDuck-----");
	}

}


package duck;

import strategy_pattern.behavior_detial.badFlyBehavior;
import strategy_pattern.behavior_detial.noQuackBehavior;

public class RedDuck extends duck {

	
	public  RedDuck() {
		flyBehavior=new badFlyBehavior();
		quackBehavior=new noQuackBehavior();
	}
	
	@Override
	public void display() {
		System.out.println("-------redDuck-----");
	}

}

package strategy_pattern.behavior;

public interface FlyBehavior {
	void fly();
}

package strategy_pattern.behavior;

public	interface QuackBehavior {
	void quack();
};

public class badFlyBehavior implements FlyBehavior {

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

}

public class GaGaQuackBehavior implements QuackBehavior {

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

	}

}

public class GodeFlyBehavior  implements FlyBehavior{

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

public class noQuackBehavior implements QuackBehavior {

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

	}

}

package test;

import duck.GreenDuck;
import duck.RedDuck;
import duck.duck;
import strategy_pattern.behavior_detial.GodeFlyBehavior;
import strategy_pattern.behavior_detial.noQuackBehavior;

public class test {
	public static void main(String[] args) {
		duck greenDuck = new GreenDuck();
		duck redDuck = new RedDuck();
		greenDuck.display();
		greenDuck.Fly();
		greenDuck.Quack();
		greenDuck.swim();
		
		
		redDuck.display();
		redDuck.Fly();
		redDuck.Quack();
		redDuck.swim();
		
		redDuck.display();
		redDuck.setFlyBehavior(new GodeFlyBehavior());
		redDuck.Fly();
		redDuck.setQuackBehavior(new noQuackBehavior());
		redDuck.Quack();
	}
}


运行结果:

-------greenDuck-----
good fly
 GAGA
~~im swim~~
-------redDuck-----
bad fly
no quack
~~im swim~~
-------redDuck-----
good fly
no quack

希望对一些朋友有所帮助,如果需要详细的讲解,那得到它的出处了。



猜你喜欢

转载自blog.csdn.net/lys1695227550/article/details/78311452