加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python设计模式之观察者模式

发布时间:2020-12-17 00:17:43 所属栏目:Python 来源:网络整理
导读:div class="markdown-here-wrapper" data-md-url="https://i.cnblogs.com/EditPosts.aspx?opt=1"gt; h1 id="-" style="margin: 20px 0px 10px; padding: 0px; font-weight: bold; color: black; font-size: 24px; border-bottom: 2px solid #aaaaaa;"一.行为

<div class="markdown-here-wrapper" data-md-url="https://i.cnblogs.com/EditPosts.aspx?opt=1"&gt;
<h1 id="-" style="margin: 20px 0px 10px; padding: 0px; font-weight: bold; color: black; font-size: 24px; border-bottom: 2px solid #aaaaaa;">一.行为型模式
<blockquote style="margin: 1.2em 0px; border-left: 4px solid #dddddd; padding: 0px 1em; color: #777777; quotes: none;">
<ul style="margin: 1.2em 0px; padding-left: 2em; list-style-type: square; font-size: 16px;">
<li style="margin: 0.5em 0px; font-size: 16px;">
<p style="margin: 0.5em 0px !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">创建型模式基于对象的创建机制,隔离了对象的创建细节,使代码能够与要创建的对象的类型相互独立

  •  abc  ABCMeta,abstractmethod
    

    <span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">NewsPublisher: <span class="hljs-comment" style="color: #7285b7;">#subject
    <span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self):
    self.subscribers = []
    self.
    latestNews = <span class="hljs-keyword" style="color: #ebbbff;">None

    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;attach</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self,subscriber)</span>:</span>
        self.__subscribers.append(subscriber)
    
    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;detach</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        <span class="hljs-keyword" style="color: #ebbbff;"&gt;return</span> self.__subscribers.pop()
    
    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;notifySubscribers</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        <span class="hljs-keyword" style="color: #ebbbff;"&gt;for</span> sub <span class="hljs-keyword" style="color: #ebbbff;"&gt;in</span> self.__subscribers:
            sub.update()
    
    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;addNews</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self,news)</span>:</span>
        self.__latestNews = news
    
    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;getNews</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        <span class="hljs-keyword" style="color: #ebbbff;"&gt;return</span> <span class="hljs-string" style="color: #d1f1a9;"&gt;'Got News:'</span>+self.__latestNews

    <span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">Subscriber<span class="hljs-params" style="color: #ffc58f;">(metaclass=ABCMeta): <span class="hljs-comment" style="color: #7285b7;">#Observer

    <span class="hljs-decorator"&gt;@abstractmethod</span>
    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;update</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        <span class="hljs-keyword" style="color: #ebbbff;"&gt;pass</span>

    <span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">ConcreteSubscriber1: <span class="hljs-comment" style="color: #7285b7;">#ConcreteObserver
    <span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self,publisher):
    self.publisher=publisher
    self.publisher.attach(self)

    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;update</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        print(type(self).__name__,self.publisher.getNews())

    <span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">ConcreteSubscriber2:
    <span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self,publisher):
    self.publisher = publisher
    self.publisher.attach(self)

    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;update</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self)</span>:</span>
        print(type(self).__name__,self.publisher.getNews())

    news_publisher = NewsPublisher()
    <span class="hljs-keyword" style="color: #ebbbff;">for Subscribers <span class="hljs-keyword" style="color: #ebbbff;">in [ConcreteSubscriber1,ConcreteSubscriber2]: <span class="hljs-comment" style="color: #7285b7;">#创建观察者对象
    Subscribers(news_publisher)

    news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'HELLO WORLD')
    news_publisher.notifySubscribers()
    news_publisher.detach()
    news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'SECOND NEWS')
    news_publisher.notifySubscribers()
    <span class="hljs-string" style="color: #d1f1a9;">'''
    ConcreteSubscriber1 Got News:HELLO WORLD
    ConcreteSubscriber2 Got News:HELLO WORLD
    ConcreteSubscriber1 Got News:SECOND NEWS
    '''


    <p style="margin: 0px 0px 1.2em !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">上面的代码应该很容易就读懂了,但是拉模型在这里是什么意思呢,先看一下拉模型的含义:


    <ul style="margin: 1.2em 0px; padding-left: 2em; list-style-type: square; font-size: 16px;">
    <li style="margin: 0.5em 0px; font-size: 16px;">
    <p style="margin: 0.5em 0px !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">每当发生变化时,主题都会向所有已经注册的观察者进行广播

  • <span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">ConcreteSubscriber2:
    <span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self,publisher):
    self.publisher = publisher
    self.publisher.attach(self)

    <span class="hljs-function" style="color: #bbdaff;"&gt;<span class="hljs-keyword" style="color: #ebbbff;"&gt;def</span> <span class="hljs-title" style="color: #7285b7;"&gt;update</span><span class="hljs-params" style="color: #ffc58f;"&gt;(self,news)

    news_publisher = NewsPublisher()
    <span class="hljs-keyword" style="color: #ebbbff;">for Subscribers <span class="hljs-keyword" style="color: #ebbbff;">in [ConcreteSubscriber1,ConcreteSubscriber2]: <span class="hljs-comment" style="color: #7285b7;">#创建观察者对象
    Subscribers(news_publisher)

    news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'HELLO WORLD')
    news_publisher.notifySubscribers()
    news_publisher.detach()
    news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'SECOND NEWS')
    news_publisher.notifySubscribers()

    <span class="hljs-string" style="color: #d1f1a9;">'''
    ConcreteSubscriber1 HELLO WORLD
    ConcreteSubscriber2 HELLO WORLD
    ConcreteSubscriber1 SECOND NEWS
    '''

    <p style="margin: 0px 0px 1.2em !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">这里只将update函数添加了传递的数据参数,并在notifySubscribers函数中传递了参数。


    <p style="margin: 0px 0px 1.2em !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">这种方式只有一个步骤就是主题发送数据,所以能够提高性能,但缺点就是观察者会获得可能自己不需要的数据,当有大量数据观察者都用不到的话就会很浪费了,使响应时间过长。两种方式各有利弊


    <h1 id="-" style="margin: 20px 0px 10px; padding: 0px; font-weight: bold; color: black; font-size: 24px; border-bottom: 2px solid #aaaaaa;">四.观察者模式的优缺点


    <p style="margin: 0px 0px 1.2em !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">优点:


    <ul style="margin: 1.2em 0px; padding-left: 2em; list-style-type: square; font-size: 16px;">
    <li style="margin: 0.5em 0px; font-size: 16px;">
    <p style="margin: 0.5em 0px !important; font-size: 16px; line-height: 1.75em; padding-right: 0.5em; padding-left: 0.5em;">它使彼此交互的对象保持松耦合

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读