zoukankan      html  css  js  c++  java
  • adaptertwowayseabird.cs

      using System;
      using EngineeringService;

        // Two-way Adapter Pattern                  Pierre-Henri Kuate and Judith Bishop Aug 2007
        // Embedded system for a SeaBird flying plane

      namespace EngineeringService {  
     
        //ITarget interface
        public interface IAircraft {
          bool Airborne {get;}  
          void TakeOff();
          int Height {get;}
        }
       
        // Target
        public sealed class Aircraft : IAircraft {
          int height;
          bool airborne;
          public Aircraft() {
            height = 0;
            airborne = false;
          }
        
          public void TakeOff () {
            Console.WriteLine("Aircraft engine takeoff");
            airborne = true;
            height = 200; //metres
          }
          
          public bool Airborne {
            get {return airborne;}
          }
          
          public int Height  {
            get {return height;}
          }
        }
      }  // end of EngineeringService

      //Adaptee interface
      public interface ISeacraft {
        int Speed {get;}
        void IncreaseRevs();
      }
     
      // Adaptee   
      public class Seacraft : ISeacraft {
        int speed = 0;
        
        public virtual void IncreaseRevs() {
          speed += 10;
          Console.WriteLine("Seacraft engine increases revs to " + speed + " knots");
        }
        
        public int Speed {
          get {return speed;}
        }
      }

      //Adapter
      public class Seabird : Seacraft, IAircraft {
        int height = 0;
        // A two-way adapter hides and routes the Target's methods
        //  Use Seacraft instructions to implement this one
        public  void TakeOff() {
          while (!Airborne)
            IncreaseRevs();
        }
     
        //Routes this straight back to the Aircraft
        public int Height {
          get {return height;}
        }
     
        // This method is common to both Target and Adaptee
        public override void IncreaseRevs() {
          base.IncreaseRevs();
          if(Speed > 40)
            height += 100;
        }

        public bool Airborne {
          get {return height > 50;}
        }
      }

      class InventorTest {
        static void Main () {
          // No adapter
          Console.WriteLine("Experiment 1: test the aircraft engine");
          IAircraft aircraft = new Aircraft();
          aircraft.TakeOff();
          if (aircraft.Airborne)
            Console.WriteLine("The aircraft engine is fine, flying at "+aircraft.Height+"metres");
          
          // Classic usage of an Adapter
          Console.WriteLine("\nExperiment 2: Use the engine in the SeaBird");
          IAircraft seabird = new Seabird();
          seabird.TakeOff(); // and automatically increases speed
          Console.WriteLine("The SeaBird took off");
          
          // Two-way adapter: using seacraft instructions on an IAircraft object
          // (where they are not in the IAricraft interface)
          Console.WriteLine("\nExperiment 3: Increase the speed of the Seabird:");
          (seabird as ISeacraft).IncreaseRevs();
          (seabird as ISeacraft).IncreaseRevs();
          if (seabird.Airborne)
          Console.WriteLine("Seabird flying at height "+ seabird.Height +
                      " metres and speed "+(seabird as ISeacraft).Speed + " knots");
          Console.WriteLine("Experiments successful; the Seabird flies!");
        }
      }

    /* Output
    Experiment 1: test the aircraft engine
    Aircraft engine takeoff
    The aircraft engine is fine, flying at 200metres

    Experiment 2: Use the engine in the SeaBird
    Seacraft engine increases revs to 10 knots
    Seacraft engine increases revs to 20 knots
    Seacraft engine increases revs to 30 knots
    Seacraft engine increases revs to 40 knots
    Seacraft engine increases revs to 50 knots
    The SeaBird took off

    Experiment 3: Increase the speed of the Seabird:
    Seacraft engine increases revs to 60 knots
    Seacraft engine increases revs to 70 knots
    Seabird flying at height 300 metres and speed 70 knots
    Experiments successful; the Seabird flies!
    */
  • 相关阅读:
    和尚和屠夫
    不要变成自己讨厌的人
    ngnix 反向代理来解决前端跨域问题
    Python 进阶 异步async/await
    Java 基础 多线程和线程池基础
    Java 基础 IO流之序列化
    Python 元类
    selenium 淘宝登入反爬虫解决方案(亲测有效)
    Java 基础 IO流(转换流,缓冲)
    Java 基础 IO流
  • 原文地址:https://www.cnblogs.com/shihao/p/2499948.html
Copyright © 2011-2022 走看看