• C#经典机试题(猫叫)


      猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

      1.要有联动性,老鼠和主人的行为是被动的。

      2.考虑可扩展性,猫的叫声可能引起其他联动效应。

    1、运用接口:

    代码
    public interface Observer {
    void Response(); //观察者的响应,这是老鼠见到猫的反映
    }

    public interface Subject {
    void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
    }
    /// <summary>
    /// 老鼠的相应,继承被观察的对象
    /// </summary>
    public class Mouse : Observer {

    private string name;
    public Mouse(string name, Subject subj) {
    this.name = name;
    subj.AimAt(
    this);
    }
    public void Response() {
    Console.WriteLine(name
    + " attempt to escape!");
    }

    }
    /// <summary>
    /// 主人的相应,继承被观察的对象
    /// </summary>
    public class Master : Observer {
    public Master(Subject subj) {
    subj.AimAt(
    this);
    }
    public void Response() {
    Console.WriteLine(
    "Host waken!");
    }
    }
    /// <summary>
    /// 猫观充当观察者的角色
    /// </summary>
    public class Cat : Subject {
    private ArrayList observers;
    public Cat() {
    this.observers = new ArrayList();
    }
    public void AimAt(Observer obs) {
    this.observers.Add(obs);
    }
    public void Cry() {
    Console.WriteLine(
    "Cat cryed!");
    foreach (Observer obs in this.observers) {
    obs.Response();
    }
    }
    }

    class MainClass {
    static void Main(string[] args) {
    Cat cat
    = new Cat();
    Mouse mouse1
    = new Mouse("mouse1", cat);
    Mouse mouse2
    = new Mouse("mouse2", cat);
    Master master
    = new Master(cat);
    cat.Cry();
    }
    }

    2、 使用event -- delegate设计..

    代码
    public delegate void SubEventHandler();

    public abstract class Subject {
    public event SubEventHandler SubEvent;
    protected void FireAway() {
    if (this.SubEvent != null)
    this.SubEvent();
    }
    }
    public class Cat : Subject {
    public void Cry() {
    Console.WriteLine(
    "cat cryed.");
    this.FireAway();
    }
    }
    public abstract class Observer {
    public Observer(Subject sub) {
    sub.SubEvent
    += new SubEventHandler(Response);
    }
    public abstract void Response();
    }
    public class Mouse : Observer {
    private string name;
    public Mouse(string name, Subject sub) : base(sub) {
    this.name = name;
    }
    public override void Response() {
    Console.WriteLine(name
    + " attempt to escape!");
    }
    }
    public class Master : Observer {
    public Master(Subject sub) : base(sub){
    }
    public override void Response() {
    Console.WriteLine(
    "host waken");
    }
    }
    class Class1 {
    static void Main(string[] args) {
    Cat cat
    = new Cat();
    Mouse mouse1
    = new Mouse("mouse1", cat);
    Mouse mouse2
    = new Mouse("mouse2", cat);
    Master master
    = new Master(cat); cat.Cry();
    }
    }

     转自:http://kb.cnblogs.com/page/50471/

  • 相关阅读:
    log4net使用封装,无缝切换 dotnet 和 dotnetcore
    使用 certbot 申请泛域名https证书
    StackExchange.Redis中文使用文档
    在 asp.net core 中使用类似 Application 的服务
    不一样的 SQL Server 日期格式化
    你可能不知道的 docker 命令的奇淫怪巧
    [k8s]dashboard1.8.1搭建( heapster1.5+influxdb+grafana)
    [k8s]k8s 1.9(on the fly搭建) 1.9_cni-flannel部署排错 ipvs模式
    [k8s] kubelet单组件启动静态pod
    [svc]runinit管理多进程
  • 原文地址:https://www.cnblogs.com/gaoshuai/p/1755728.html
Copyright © 2020-2023  润新知