小鸟 组合模式 构造函数 传入一个新的接口实现对象 添加新功能

本文通过一个Java实例展示了如何使用组合模式在运行时为鸟类对象添加新的叫声功能。通过定义接口Shouta,创建实现该接口的HaHaShout和GaGaShout类,然后在Bird类中增加构造函数接收Shouta接口对象,实现动态改变子类行为。在测试类中,创建Bird对象时传入不同实现类,使得FireBird和RedBird分别能haha和gaga叫。
摘要由CSDN通过智能技术生成
package day08.chouXiangLeiHeJieKou;

public class TestBirds {

	/**组合 :
	 * 本来 设计的 Bird 类和 其子类中的 Firebird 还有 Redbird ,FoolBird,happyBird并没有shout方法  
	 * 要求:现需要添加使RedBird能实现haha叫  其他三中鸟实现GaGa叫
	 * 		1.刚开始是想着直接在父类中定义抽象方法去让子类去复写 这样的话 如果有很多种鸟  那每种鸟(即鸟的子类)都需要去
	 * 	复写父类的方法 会造成代码冗余 。
	 * 		2.那么想象 要不直接定义一个接口 让子类去实现这个接口  里面的叫方法 本质和第一种想法是一样的 还有个确定就是在
	 * 测试类中, 不能以多态的形式 去建立一个鸟类型的对象去访问子类型中的shout方法 因为父类型中 没有定义该方法
	 * 		3.组合模式:
	 * 		重点:
	 * 		在 集合中 我们经常看到 诸如此类的构造方法
	 * 		ArrayList(Collection<? extends E> c) 
          	构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
          	上面的代码是通过向Arraylist中传入实现了Collection接口的实现类 来构造一个新的ArrayList的类
          	那么 我们在这里能不能也这么做呢?
          	在添加新方法遇到困难时 我们已经想到的接口 那么 可不可以直接定义一些类(后期在这个例子中个人感觉
          	可以直接用匿名内部类)来实现一个Shouta 接口的呢?  所以我们定义了两个类HaHaShout 和 GaGaShout
          	定义这两个类是为了 构造一个新的FireBird  还有RedBird等, 那么这个时候我们是不是应该去重写我们的鸟子类中的
          	构造函数了呢? 故我们就真的这么做了 在FireBird类中定义了一个名为
		    fireBird(Shouta a)
			{
				super(a);
				this.name= "fire Bird";
			}
			此时 会提示编译失败 因为父类中是没有定义这种构造函数的
			所以我们去父类中也定义了这么一个构造函数
			public Bird(Shouta a)
			{
				this.shout_a = a ;-->提示编译失败
			}
			因为没有shout_a这种属性 所以定义一个shout_a这个成员变量
			在 我们的测试类中 Bird a = new FireBird(new HaHaShout(){public void shout(){System.out.println("HAHAHA")}});
		          中 需要调用 a.shout();这个函数 所以 还应该有一个在 父类中的一个 通过属性shout_a 来实现
		    public void shout()
		    {
		    	shout_a.shout();
		    }
		    这样就圆满了、、、、、、、
		    总结 :
		    	1.在实现添加新功能的时候 应该新建一个新功能接口
		    	2.再建立新功能的相关对象
		    	3.这就要求源对象重新新建一个 构造函数 并且这种构造函数的形参是 新功能的接口 
		    	4.修改父类中的成员变量  添加新功能的接口 定义调用新功能的函数 通过成员属性去调用接口中的函数 
	 * @param args
	 */
	public static void main(String[] args) {
//		HaHaShout h = new HaHaShout();
//		GaGaShout g = new GaGaShout();
		Bird a = new fireBird(new HaHaShout());
		Bird b = new RedBird(new GaGaShout());
//		a.trueShout();
		b.attack();
		b.fly();
		b.shout();
		a.attack();
		a.fly();
		a.shout();
	}

}
package day08.chouXiangLeiHeJieKou;

public  abstract class Bird //implements Shouta
{
	protected String name;
	protected Shouta shout_a;
	public Bird(Shouta a)
	{
		this.shout_a = a ;
	}
	public String getName() {
		return name;
	}
	public void shout()
	{
		shout_a.shout();
	}
	public void setName(String name) {
		this.name = name;
	}
	public void fly()
	{
		System.out.println(name + " fly ");
	}
//	public void shout()
//	{
//		System.out.println(name + " oooooooo");
//	}
	public abstract void  attack();
	
}

package day08.chouXiangLeiHeJieKou;

public class RedBird extends Bird {
	RedBird(Shouta a)
	{
		super(a);
		this.name = "red bird";
	}
	public void  attack()
	{
		System.out.println(this.getName()+"attack foolly");
	}

}

package day08.chouXiangLeiHeJieKou;

public class fireBird extends Bird   {
	fireBird(Shouta a)
	{
		super(a);
		this.name= "fire Bird";
	}
	public void  attack()
	{
		System.out.println(this.getName()+"fire the hole");
	}

}
package day08.chouXiangLeiHeJieKou;

public interface Shouta {
	public abstract void shout();
}

package day08.chouXiangLeiHeJieKou;

public class GaGaShout implements Shouta {
	public void shout()
	{
		System.out.println("gagagaga");
	}

}
package day08.chouXiangLeiHeJieKou;

public class HaHaShout implements Shouta {
	public void shout()
	{
		System.out.println("hahahah");
	}

}



好的,以下是一个简单的示例程序,演示了类、对象、继承、抽象类和接口的应用: ```python # 定义一个动物类 class Animal: def __init__(self, name, age): self.name = name self.age = age def speak(self): pass # 定义一个狗类,继承自动物类 class Dog(Animal): def __init__(self, name, age): super().__init__(name, age) def speak(self): return "汪汪!" # 定义一个猫类,继承自动物类 class Cat(Animal): def __init__(self, name, age): super().__init__(name, age) def speak(self): return "喵喵!" # 定义一个抽象类,表示可以飞的动物 from abc import ABC, abstractmethod class FlyingAnimal(ABC): @abstractmethod def fly(self): pass # 定义一个鸟类,继承自动物类和飞行动物类 class Bird(Animal, FlyingAnimal): def __init__(self, name, age): super().__init__(name, age) def speak(self): return "叽叽喳喳!" def fly(self): return "我正在飞行!" # 定义一个接口,表示可以游泳的动物 class SwimmingAnimal: def swim(self): pass # 定义一个鱼类,实现了游泳动物接口 class Fish(Animal, SwimmingAnimal): def __init__(self, name, age): super().__init__(name, age) def speak(self): return "没有声音!" def swim(self): return "我正在游泳!" # 创建对象并调用方法 dog = Dog("小狗", 3) print(dog.name, dog.age, dog.speak()) cat = Cat("小猫", 2) print(cat.name, cat.age, cat.speak()) bird = Bird("小鸟", 1) print(bird.name, bird.age, bird.speak(), bird.fly()) fish = Fish("小鱼", 1) print(fish.name, fish.age, fish.speak(), fish.swim()) ``` 输出结果如下: ``` 小狗 3 汪汪! 小猫 2 喵喵! 小鸟 1 叽叽喳喳! 我正在飞行! 小鱼 1 没有声音! 我正在游泳! ``` 在这个示例程序中,我们定义了一个动物类,然后派生出狗类、猫类和鸟类,它们都继承了动物类,并重写了 speak 方法。同时,我们定义了一个抽象类 FlyingAnimal,表示可以飞的动物,然后定义了一个鸟类,继承了动物类和 FlyingAnimal 抽象类,并实现了 fly 方法。最后,我们定义了一个接口 SwimmingAnimal,表示可以游泳的动物,然后定义了一个鱼类,继承了动物类并实现了 SwimmingAnimal 接口的 swim 方法。在程序中,我们创建了各种对象,并调用了它们的方法来展示它们的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值