- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace 设计模式
- {
- class Program
- {
- static void Main(string[] args)
- {
- //首先,原型模式是一种创建型模式,用来处理由于new所带来的依赖关系
- //原型模式的要领有2点: 1 解决依赖,也就是说客户代码要依赖于抽象,而不是实现
- //2 要通过接象的原型,克隆实现类的实例。
- //下面我们举例说明: 比如一个魂斗罗游戏,我们来模拟处理不同的敌人 .
- //敌人分为天上飞上,地上走的,水里游的。。 天上飞的可以扔炸弹,地上走的可以打枪,水里游的可以使用刀子伤人
- //下面我们开始定义3种敌人的抽象类,注,因为要实现克隆方法,所以不可以是接口。
- //接着,我们为这三种类型的人,来做具体的实现类,比如水里游的敌人,我们做一种穿盔甲的敌人。
- //这就是封装了变化点,就是说,水里游的敌人,什么时候都一定会有刀,但是有的是有盔甲的,有的是没有的。
- //也就是说,刀不变,盔甲可以变,因为是举例说明,其他2种类型一样用盔甲来说明变化,其实如果是真实项目,变化点的抽像应更多
- //接着我们编写游戏运行时的情况,这里,我们完全不依赖于实现类,但是可以制造出一批一批的敌人。
- //下面我们开始运行游戏。。。。
- WaterActor w = new ArmorWaterActor() ;
- FlyActor f = new NormalFlyActorActor() ;
- RoadActor r = new ArmorRoadActor() ;
- //可以看出,我们将水中的人,与陆地的人,实例化成了有盔甲的兵
- GameSystem gm = new GameSystem( w , r ,f ) ;
- gm.RunGame() ;
- //假设我们要将水中与陆地的人,换成没有盔甲的,只需要要在些处,给他们不同的实例,不需要去动依赖处GM
- WaterActor w1 = new NormalWaterActor() ;
- FlyActor f1 = new ArmorFlyActorActor() ;
- RoadActor r1 = new NormalRoadActor() ;
- //可以看出,我们将水中的人,与陆地的人,实例化成了有盔甲的兵
- GameSystem gm1 = new GameSystem( w1 , r1 ,f1 ) ;
- gm1.RunGame() ;
- Console.ReadLine() ;
- }
- }
- //水里游的敌人
- abstract class WaterActor
- {
- //返回自身的实例,用系统自带的浅拷贝,注,如果是有引用类型,推荐用序列化与反序列化实现深度拷贝
- public WaterActor Clone()
- {
- return ( WaterActor )this.MemberwiseClone() ;
- }
- //小刀攻击方法
- public abstract void KnifeAttack() ;
- }
- //天上飞的敌人
- abstract class FlyActor
- {
- public FlyActor Clone()
- {
- return ( FlyActor )this.MemberwiseClone() ;
- }
- //投掷炸弹
- public abstract void BombAttack() ;
- }
- //地上走的敌人
- abstract class RoadActor
- {
- public RoadActor Clone()
- {
- return ( RoadActor )this.MemberwiseClone() ;
- }
- //机枪扫射
- public abstract void GunAttack() ;
- }
- class ArmorWaterActor:WaterActor
- {
- public override void KnifeAttack()
- {
- Console.WriteLine( "%%%有盔甲水中敌人用小刀攻击" ) ;
- }
- }
- class NormalWaterActor:WaterActor
- {
- public override void KnifeAttack()
- {
- Console.WriteLine( "%%%%%%%%%%%%没有盔甲水中敌人用小刀攻击" ) ;
- }
- }
- class ArmorFlyActorActor:FlyActor
- {
- public override void BombAttack()
- {
- Console.WriteLine( "###有盔甲空中敌人投掷炸弹" ) ;
- }
- }
- class NormalFlyActorActor:FlyActor
- {
- public override void BombAttack()
- {
- Console.WriteLine( "###############没有盔甲空中敌人投掷炸弹" ) ;
- }
- }
- class ArmorRoadActor:RoadActor
- {
- public override void GunAttack()
- {
- Console.WriteLine( "@@@有盔甲陆地敌人用机枪扫射" ) ;
- }
- }
- class NormalRoadActor:RoadActor
- {
- public override void GunAttack()
- {
- Console.WriteLine( "@@@@@@@@@@@没有盔甲陆地敌人用机枪扫射" ) ;
- }
- }
- class GameSystem
- {
- private WaterActor wactor ;
- private RoadActor ractor ;
- private FlyActor factor ;
- public GameSystem( WaterActor wactor , RoadActor ractor , FlyActor factor )
- {
- this.wactor = wactor ;
- this.ractor = ractor ;
- this.factor = factor ;
- }
- public void RunGame()
- {
- WaterActor w1 = this.wactor.Clone() ;
- WaterActor w2 = this.wactor.Clone() ;
- WaterActor w3 = this.wactor.Clone() ;
- WaterActor w4 = this.wactor.Clone() ;
- WaterActor w5 = this.wactor.Clone() ;
- //在此处,我们完全不关心,子类是有盔甲的,还是没有盔甲的。。不管你有盔甲没,都要攻击。。
- w1.KnifeAttack() ;
- w2.KnifeAttack() ;
- w3.KnifeAttack() ;
- w4.KnifeAttack() ;
- w5.KnifeAttack() ;
- FlyActor f1 = this.factor.Clone() ;
- FlyActor f2 = this.factor.Clone() ;
- FlyActor f3 = this.factor.Clone() ;
- FlyActor f4 = this.factor.Clone() ;
- f1.BombAttack() ;
- f2.BombAttack() ;
- f3.BombAttack() ;
- f4.BombAttack() ;
- RoadActor r1 = this.ractor.Clone() ;
- RoadActor r2 = this.ractor.Clone() ;
- RoadActor r3 = this.ractor.Clone() ;
- RoadActor r4 = this.ractor.Clone() ;
- RoadActor r5 = this.ractor.Clone() ;
- r1.GunAttack() ;
- r2.GunAttack() ;
- r3.GunAttack() ;
- r4.GunAttack() ;
- r5.GunAttack() ;
- }
- }
- }
C#实现原型模式
最新推荐文章于 2024-04-19 10:44:46 发布