C# 设计模式 行为型模式 之 观察者模式

当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象并全部更新执行。观察者模式属于行为型模式。

生活实例:拍卖的时候,拍卖师观察最高标价,然后通知给其他所有竞价者竞价。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

下面 通过 代码 演示 观察者模式

using Microsoft.VisualBasic;
using System;
using System.Data;

namespace 观察者模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Standard standard = new Standard();

            Binary binary = new Binary(standard);
            Octal octal = new Octal(standard);
            Hexadecimal hexadecimal = new Hexadecimal(standard);

            standard.SetState(60);


            Console.WriteLine("----------------------");

            standard.SetState(100);

            /*
             * 控制台输出:
            二进制为:111100
            八进制为:74
            十六进制为:3c
            ----------------------
            二进制为:1100100
            八进制为:144
            十六进制为:64
             */

        }
    }
    //观察者 调度类
    public class Standard
    {
        private int State;
        private List<Observer> observers = new List<Observer>();
        public void AddObserver(Observer observer)
        {
            observers.Add(observer);
        }
        public int GetState()
        {
            return State;
        }
        public void SetState(int s)
        {
            State = s;
            this.Update(s);
        }
        private void Update(int s)
        {
            foreach (Observer observer in observers)
            {
                observer.Update();
            }
        }
    }
    //观察者 抽象类
    public abstract class Observer
    {
        protected Standard standard;
        public abstract void Update();
    }

    public class Binary : Observer
    {
        public Binary(Standard standard)
        {
            base.standard = standard;
            base.standard.AddObserver(this);
        }
        public override void Update()
        {
            Console.WriteLine("二进制为:"+Convert.ToString(standard.GetState(), 2));
        }
    }
    public class Octal : Observer
    {
        public Octal(Standard standard)
        {
            base.standard = standard;
            base.standard.AddObserver(this);
        }
        public override void Update()
        {
            Console.WriteLine("八进制为:" + Convert.ToString(standard.GetState(), 8));
        }
    }
    public class Hexadecimal : Observer
    {
        public Hexadecimal(Standard standard)
        {
            base.standard = standard;
            base.standard.AddObserver(this);
        }
        public override void Update()
        {
            Console.WriteLine("十六进制为:" + Convert.ToString(standard.GetState(), 16));
        }
    }
}

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值