JAVA设计模式(1)

当大量代码堆积在一个程序中,,我想很多人和我一样感到无能为力和吃力,,这时候如果有一个好的思路让我们的开发变的容易呢?

那就学习设计模式吧!一起学习吧,,从头开始!自己写博客也是对学习的领悟和笔记!


我们需要开发一个模拟鸭子的游戏,游戏中有各种鸭子,可以玩水可以叫。


你的想法我不知道 我的想法就是设计一个鸭子的父类  各种鸭子继承它扩展它


如果让鸭子飞?


Duck这个基类的基础上加一个Fly方法吧,好么,,很多鸭子都不会飞呢,,修改基类的后果有多大,,显然影响的层面不仅仅是局部吧,,是全局。。有想到了,,不会飞,方法体是什么都没有不就好了,,会飞的有东西


会飞的 fly("各种方式飞”)  

不会飞的 fly();


这样也不好,,写的太多了,,很麻烦对未来。。


换个想法使用接口啊!实现Flyable接口 看似很好,,每个能飞得都要实现啊,代码很多,,都不能重复使用了


我们要改变


设计原则:找出应用中可能需要变化之处,独立出来,不要和不变的混在一起啊 变化的可变,不变化的不变


如何分开 鸭子的一些固有的属性 是共同的当然是不变的,,变化的是什么是行为吧?


不同的鸭子有不同的行为  有的会飞 有的不会 有的会叫 有的不会(那是大黄鸭) 叫的方式也不同


咕咕叫 吱吱叫  还有不动的


解决:自己写一个行为类   把可变的放进去吧  飞行行为  叫行为  Duck还是超类   


如何设计鸭子行为


我们希望一种方式是弹性的,鸭子的行为是动态可变的多好随是什么鸭子变化,,多态吧  运行时多态


设计原则  面对接口编程 不是实现编程


利用接口代表每个行为 FlyBehavior QuackBehavior 他们的实现右行为类实现不是Duck类


以前是有个基类  不同的接口让继承基类的派生类来实现  这个就是接口实现了


新设计中呢使用的是xxxBehaviour接口表示xxx行为实现没有绑定到具体的鸭子子类中。


针对接口编程实质是针对超类编程,利用多态我们可以根据不同的超类的类型,具体执行时会根据实际状况找到真正的行为,不会帮死到超类型上。  多态的解释


针对实现编程  dog x=new dog(); x.bark();


针对接口编程          Animal animal=new Dog(); animal.makesound();


不用关心是什么动物,正确发声就成了。


如何实现鸭子的行为


两个接口 FlyBehaviour QuackBehaviour


FlyWithWIngs 类 会飞的 实现方法

FlyNoWay类    不会飞的也实现  但是方法体什么都没有 


整和鸭子的行为  Duck ;类中两个实例 FlyBehaviour QuackBehaviour 接口类型 其他都是不变的东西了


方法中有PerformQuack 和 PerformBehaviour 这两个方法 实际上是前面两个引用来操作了


对于不同的鸭子我们要做的很容就是调用的不同的实现FlyBehaviour方法 


两种实现FlyWithWIngs FlyNoWay 选择不同的类即可就成。。。


下面给出一个实现就会明白

public interface FlyBehavior {

	public void fly();
}

public interface QuackBehavior {
	public void quack();
}

public class FlyNoWay implements FlyBehavior{

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		
	}
}

public class FlyWithWings implements FlyBehavior {

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("用翅膀飞吧");
	}

	
}

public class MuteQuack implements QuackBehavior{

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		
	}
	

}

public class Quack implements QuackBehavior{

	
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("呱呱叫");
	}

	

}

public abstract class Duck {

	FlyBehavior Fly;
	
    QuackBehavior Quack;
    
    public void performFly()
    {
    	Fly.fly();
    }
    public void performQuack()
    {
    	Quack.quack();
    }
}

public class YellowDuck extends Duck{

	public YellowDuck()
	{
		Fly=new FlyNoWay();
		Quack=new MuteQuack();
	}

}

public class NormalDuck extends Duck {
	public NormalDuck()
	{
		Fly=new FlyWithWings();
		Quack=new Quack();
	}

	
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值