观察者模式之Tom and Jerry

namespace TomAndJerry
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 通过接口来完成
            猫
            //Tom t = new Tom();
            Mouse
            //Jerry j = new Jerry(t);
            //Jerry j1 = new Jerry(t);
            Owner
            //Owner o = new Owner(t);

            //t.Cry();
            //Console.Read();
            #endregion

            #region 通过事件来完成

            //Cat cat = new Cat("Tom");
            建立关系
            //Mouse jerry = new Mouse("Jerry", cat);

            //Owner o = new Owner("Jason", cat);

            Tom 触发事件
            //cat.CatCry();

            //Console.Read();

            #endregion

            #region 通过抽象类完成

            Cat cat = new Cat();
            Mouse jerr = new Mouse(cat);
            Owner o = new Owner(cat);

            cat.Cry();
            Console.Read();

            #endregion

        }
    }

    #region 通过接口完成

    定义主动者接口
    //public interface IInitiative
    //{
    //    //通知的方法,要与接受者建立关系
    //    void Notice(IReceivenotice irnotice);
    //}

    定义接受者接口
    //public interface IReceivenotice
    //{
    //    //有一个表现的方法
    //    void Show();
    //}

    定义Tom 类,Tom 是主动者,继承主动者接口, 由它发出并触发相应的事件
    //public class Tom : IInitiative
    //{
    //    //由于发出的主动者不确定,所以放在一个数组中
    //    ArrayList alist = new ArrayList();

    //    #region IInitiative 成员

    //    public void Notice(IReceivenotice irnotice)
    //    {
    //        //建立起通知关系
    //        alist.Add(irnotice);
    //    }

    //    //猫叫的事件
    //    public void Cry()
    //    {
    //        Console.WriteLine("Tom is crying");
    //        //主动者发出的通知,接受者做出的反应都放到alist中,调用接受者的反应
    //        foreach (IReceivenotice notice in alist)
    //        {
               
    //            notice.Show();
               
    //        }
    //    }

    //    #endregion
    //}

    定义Jerry 类, Jerry 是接受者,继承接受者的接口
    //public class Jerry : IReceivenotice
    //{
    //    public Jerry()
    //    { }

    //    //明确是谁来通知的,一般有接口的父类来通知
    //    public Jerry(IInitiative iiative)
    //    {
    //        //this 表示此接口的实例
    //        iiative.Notice(this);
    //    }

    //    #region IReceivenotice 成员

    //    public void Show()
    //    {
    //        //收到通知后,产生活动
    //        Console.WriteLine("Jerry is running crazy!");
    //    }

    //    #endregion
    //}

    定义Owner 类, Owner 是接受者,继承接受者的接口
    //public class Owner : IReceivenotice
    //{
    //    public Owner()
    //    { }

    //    //明确是谁来通知的,一般有接口的父类来通知
    //    public Owner(IInitiative iiative)
    //    {
    //        iiative.Notice(this);
    //    }

    //    #region IReceivenotice 成员

    //    public void Show()
    //    {
    //        收到通知后,产生活动
    //        Console.WriteLine("The owner is wakeup , cry :'Tom , what are you doing ?'");
    //    }

    //    #endregion
    //}

    #endregion

    #region 通过事件完成

    #region 猫
    //public class Cat
    //{
    //    //猫的名字
    //    private string _name;

    //    //猫叫的事件
    //    public event EventHandler<CatCryEventArgs> CatCryEvent;

    //    //构造函数
    //    public Cat()
    //    { }
    //    public Cat(string name)
    //    {
    //        this._name = name;
    //    }

    //    //触发猫叫的事件
    //    public void CatCry()
    //    {
    //        CatCryEventArgs args = new CatCryEventArgs(_name);
    //        Console.WriteLine(args);
    //        CatCryEvent(this, args);
    //    }
    //}
    #endregion

    #region 猫叫的事件

    //public class CatCryEventArgs : EventArgs
    //{
    //    //发出叫声的猫的名字
    //    private string _name;
    //    //构造函数
    //    public CatCryEventArgs()
    //    { }
    //    public CatCryEventArgs(string name)
    //    {
    //        this._name = name;
    //    }

    //    //输出参数的内容
    //    public override string ToString()
    //    {
    //        return _name + " crying !";
    //    }
    //}

    #endregion
   
    #region 主人

    //public class Owner
    //{
    //    //主人的名
    //    private string name;

    //    //构造函数
    //    public Owner()
    //    { }
    //    public Owner(string _name,Cat cat)
    //    {
    //        this.name = _name;
    //        cat.CatCryEvent += new EventHandler<CatCryEventArgs>(CatCryEventHandle);
    //    }

    //    //猫叫的事件的处理方法
    //    void CatCryEventHandle(object sender, CatCryEventArgs e)
    //    {
    //        WakeUp();
    //    }

    //    //主人被惊醒了的方法
    //    private void WakeUp()
    //    {
    //        Console.WriteLine(name + " is wakeup and cry 'Tom what are you doing ?'");
    //    }
    //}

    #endregion

    #region 老鼠

    //public class Mouse
    //{
    //    //老鼠名
    //    private string _name;

    //    //构造函数
    //    public Mouse()
    //    { }

    //    public Mouse(string name, Cat cat)
    //    {
    //        this._name = name;
    //        cat.CatCryEvent += new EventHandler<CatCryEventArgs>(CatCryHandleRun);
    //    }

    //    //猫叫事件的处理方法
    //    void CatCryHandleRun(object sender, CatCryEventArgs e)
    //    {
    //        Run();
    //    }

    //    //老鼠跑的方法
    //    private void Run()
    //    {
    //        Console.WriteLine(_name + " is running !");
    //    }
    //}

    #endregion

    #endregion

    #region 通过抽象类完成,与接口完成类似

    //定义主动
    public abstract class Observer
    {
        //通知的方法
        public abstract void Notice(Reobj robj);
    }

    //定义接收
    public abstract class Reobj
    {
        public abstract void Show();
    }

    //定义主动者
    public class Cat : Observer
    {
        ArrayList al = new ArrayList();

        public override void Notice(Reobj robj)
        {
            al.Add(robj);
        }

        public void Cry()
        {
            Console.WriteLine("Tom 大喊一声!");
            foreach (Reobj o in al)
            {
                o.Show();
            }
        }
    }

    //定义接收者
    public class Mouse : Reobj
    {
        public Mouse()
        { }
        public Mouse(Observer obs)
        {
            obs.Notice(this);
        }

        public override void Show()
        {
            Console.WriteLine("Jerry is running!");
        }
    }

    //定义Owner
    public class Owner : Reobj
    {
        public Owner()
        { }

        public Owner(Observer obs)
        {
            obs.Notice(this);
        }  

        public override void Show()
        {
            Console.WriteLine("主人醒了,大喊:Tom what are you doing?");
        }
    }

    #endregion
}

转载于:https://www.cnblogs.com/jasonjiang/archive/2010/06/23/1763448.html

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML5CSS3是用于网页设计和开发的最新标准技术。以下是一些常见的HTML5CSS3开发的总复习题及答案。 1. HTML5中的新特性有哪些? 答案:HTML5中的新特性包括语义化标签(如<article>、<section>和<header>等),音频和视频支持,Canvas画布,本地存储(localStorage和sessionStorage),地理位置API等等。 2. CSS3中的新特性有哪些? 答案:CSS3中的新特性包括圆角边框(border-radius),阴影(box-shadow),渐变背景(linear-gradient和radial-gradient),动画(@keyframes),过渡(transition)等等。 3. 如何在HTML文档中引用外部CSS文件? 答案:可以使用<link>标签将外部CSS文件链接到HTML文档中。例如:<link rel="stylesheet" href="style.css"> 4. 如何在HTML文档中引用外部JavaScript文件? 答案:可以使用<script>标签将外部JavaScript文件链接到HTML文档中。例如:<script src="script.js"></script> 5. 如何在HTML文档中插入图片? 答案:可以使用<img>标签插入图片。例如:<img src="image.jpg" alt="描述文本"> 6. 如何创建一个有序列表(有序的编号)? 答案:可以使用<ol>和<li>标签创建有序列表。例如:<ol><li>第一项</li><li>第二项</li></ol> 7. 如何创建一个无序列表(无序的项目符号)? 答案:可以使用<ul>和<li>标签创建无序列表。例如:<ul><li>项目一</li><li>项目二</li></ul> 8. 如何创建一个超链接? 答案:可以使用<a>标签创建超链接。例如:<a href="http://www.example.com">链接文本</a> 9. 如何设置文本的字体样式? 答案:可以使用font-family属性设置文本的字体样式。例如:font-family: Arial, sans-serif; 10. 如何调整盒子的位置和大小? 答案:可以使用margin、padding、width和height属性来调整盒子的位置和大小。例如:margin: 10px; padding: 20px; width: 200px; height: 150px; 这些问题和答案只是一部分HTML5CSS3开发的总复习题目。希望对你进行复习和巩固知识有所帮助。请继续学习和实践,加深对于HTML5CSS3的理解和运用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值