zoukankan      html  css  js  c++  java
  • 适配器模式实例(C#)

    适配器模式实例(C#):

     

    用Adapter模式设计一个仿生机器人:

    要求机器人可以模拟各种动物行为,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样汪汪叫,像狗一样快跑,或者像鸟一样叽叽叫,像鸟一样快快飞,使用适配器模式进行系统设计。


    类图:


    说明:此类图有visual studio 2012 自动生成。由类图可见,首先实现的一个AnimalAdaptee的类,下面是两个字类,分别具体实现鸟和狗的Cry和Move方法。Robot是一个抽象类,具体的Adaptor类实RobotAdaptor类,它申明了一个私有的_myAdaptee字段,其类型为AnimalAdaptee。

    由以上的实现,可以达到适配器模式和桥模式的效果,我们看到Adaptor中也没有具体的指定需要定制化的Adaptee,而是只维护了一个一类Adaptee的引用,这样可以使程序设计的可扩展性更强。

    源代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace RobotAdaptor
    {
        //机器人类
        abstract public class Robot
        {
            abstract public void RobotCry();
            abstract public void RobotMove();
            abstract public void SetAdaptee(object Value); //这么申明带有一个参数的抽象方法。
        }
        //抽象的Adaptee
        public class AnimalAdaptee
        {
            public virtual void Cry() { }
            public virtual void Move() { }    //这个虚拟居然这样用。。
        }
    
        //不同种类的动物
        //狗
        public class DogAdaptee : AnimalAdaptee
        {
            public override void Cry()
            {
                //base.Cry();
                Console.WriteLine("这是狗叫:汪汪汪!");
            }
            public override void Move()
            {
                //base.Move();
                Console.WriteLine("这是狗跳:跳跳跳!");
            }
        }
        //鸟
        public class BirdAdaptee : AnimalAdaptee
        {
            public override void Cry()
            {
                //base.Cry();
                Console.WriteLine("这是鸟叫:叽叽叽!");
            }
            public override void Move()
            {
                //base.Move();
                Console.WriteLine("这是鸟飞:快快飞!");
            }
        }
    
        //适配器类Adaptor
        public class RobotAdapptor : Robot
        {
            private AnimalAdaptee _myAdaptee;
            public AnimalAdaptee MyAdaptee
            {
                get { return _myAdaptee; }
                set { _myAdaptee = value; }
            }
            public override void SetAdaptee(Object Value)
            {
                _myAdaptee = (AnimalAdaptee)Value;
            }
            public override void RobotCry()
            {
                //throw new NotImplementedException();
                if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee();
                _myAdaptee.Cry();
            }
            public override void RobotMove()
            {
                //throw new NotImplementedException();
                if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee();
                _myAdaptee.Move();
            }
    
        }
        class Program
        {
            static void Main(string[] args)
            {
                Robot MyRobot = new RobotAdapptor();
                AnimalAdaptee dogAdaptee = new DogAdaptee();
    
                MyRobot.SetAdaptee(dogAdaptee);
                MyRobot.RobotCry();
                MyRobot.RobotMove();
    
                //申明为第二种鸟类
                AnimalAdaptee birdAdaptee=new BirdAdaptee();
                MyRobot.SetAdaptee(birdAdaptee);
                MyRobot.RobotCry();
                MyRobot.RobotMove();
    
                Console.ReadKey();
            }
        }
    }
    

    结果截图:



    直观的关系图:




  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3132177.html
Copyright © 2011-2022 走看看