fbpx
维基百科

责任链模式

责任链模式物件導向程式設計裡是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。

代码示例 编辑

Java 编辑

以下的日志类(logging)例子演示了该模式。 每一个logging handler首先决定是否需要在该层做处理,然后将控制传递到下一个logging handler。程序的输出是:

 Writting to stdout: Entering function y. Writting to stdout: Step1 completed. Sending via e-mail: Step1 completed. Writting to stdout: An error has occurred. Sending via e-mail: An error has occurred. Writing to stderr: An error has occurred. 

注意:该例子不是日志类的推荐实现方式。

同时,需要注意的是,通常在责任链模式的实现中,如果在某一层已经处理了这个logger,那么这个logger就不会传递下去。在我们这个例子中,消息会一直传递到最底层不管它是否已经被处理。

import java.util.*; abstract class Logger  {  public static int ERR = 3;  public static int NOTICE = 5;  public static int DEBUG = 7;  protected int mask;  // The next element in the chain of responsibility  protected Logger next;  public Logger setNext( Logger l)  {  next = l;  return this;  }  public final void message( String msg, int priority )  {  if ( priority <= mask )   {  writeMessage( msg );  if ( next != null )  {  next.message( msg, priority );  }  }  }    protected abstract void writeMessage( String msg ); } class StdoutLogger extends Logger  {  public StdoutLogger( int mask ) { this.mask = mask; }  protected void writeMessage( String msg )  {  System.out.println( "Writting to stdout: " + msg );  } } class EmailLogger extends Logger  {  public EmailLogger( int mask ) { this.mask = mask; }  protected void writeMessage( String msg )  {  System.out.println( "Sending via email: " + msg );  } } class StderrLogger extends Logger  {  public StderrLogger( int mask ) { this.mask = mask; }  protected void writeMessage( String msg )  {  System.out.println( "Sending to stderr: " + msg );  } } public class ChainOfResponsibilityExample {  public static void main( String[] args )  {  // Build the chain of responsibility  Logger l = new StdoutLogger( Logger.DEBUG).setNext(  new EmailLogger( Logger.NOTICE ).setNext(  new StderrLogger( Logger.ERR ) ) );  // Handled by StdoutLogger  l.message( "Entering function y.", Logger.DEBUG );  // Handled by StdoutLogger and EmailLogger  l.message( "Step1 completed.", Logger.NOTICE );  // Handled by all three loggers  l.message( "An error has occurred.", Logger.ERR );  } } 

PHP 编辑

<?php abstract class Logger { const ERR = 3; const NOTICE = 5; const DEBUG = 7; protected $mask; protected $next; // The next element in the chain of responsibility public function setNext(Logger $l) { $this->next = $l; return $this; } abstract public function message($msg, $priority); } class DebugLogger extends Logger { public function __construct($mask) { $this->mask = $mask; } public function message($msg, $priority) { if ($priority <= $this->mask) { echo "Writting to stdout: {$msg}\n"; } if (false == is_null($this->next)) { $this->next->message($msg, $priority); } } } class EmailLogger extends Logger { public function __construct($mask) { $this->mask = $mask; } public function message($msg, $priority) { if ($priority <= $this->mask) { echo "Sending via email: {$msg}\n"; } if (false == is_null($this->next)) { $this->next->message($msg, $priority); } } } class StderrLogger extends Logger { public function __construct($mask) { $this->mask = $mask; } public function message($msg, $priority) { if ($priority <= $this->mask) { echo "Writing to stderr: {$msg}\n"; } if (false == is_null($this->next)) { $this->next->message($msg, $priority); } } } class ChainOfResponsibilityExample { public function __construct() { // build the chain of responsibility $l = new DebugLogger(Logger::DEBUG); $e = new EmailLogger(Logger::NOTICE); $s = new StderrLogger(Logger::ERR); $e->setNext($s); $l->setNext($e); $l->message("Entering function y.", Logger::DEBUG); // handled by DebugLogger $l->message("Step1 completed.", Logger::NOTICE); // handled by DebugLogger and EmailLogger $l->message("An error has occurred.", Logger::ERR); // handled by all three Loggers } } new ChainOfResponsibilityExample(); ?> 

Visual Prolog 编辑

这是一个用mutex保护对于stream的操作的真实例子。

First the outputStream interface (a simplified version of the real one):

interface outputStream predicates write : (...). writef : (string FormatString, ...). end interface outputStream 

This class encapsulates each of the stream operations the mutex. The finally predicate is used to ensure that the mutex is released no matter how the operation goes (i.e. also in case of exceptions). The underlying mutex object is released by a finalizer in the mutex class, and for this example we leave it at that.

class outputStream_protected : outputStream constructors new : (string MutexName, outputStream Stream). end class outputStream_protected #include @"pfc\multiThread\multiThread.ph" implement outputStream_protected facts mutex : mutex. stream : outputStream. clauses new(MutexName, Stream) :- mutex := mutex::createNamed(MutexName, false), % do not take ownership stream := Stream. clauses write(...) :- _ = mutex:wait(), % ignore wait code in this simplified example finally(stream:write(...), mutex:release()). clauses writef(FormatString, ...) :- _ = mutex:wait(), % ignore wait code in this simplified example finally(stream:writef(FormatString, ...), mutex:release()). end implement outputStream_protected 

Usage example.

The client uses an outputStream. Instead of receiving the pipeStream directly, it gets the protected version of it.

#include @"pfc\pipe\pipe.ph" goal Stream = pipeStream::openClient("TestPipe"), Protected = outputStream_protected::new("PipeMutex", Stream), client(Protected), Stream:close(). 

另見 编辑

  • Interception pattern
  • Interceptor pattern
  • Single responsibility principle

外部链接 编辑

  • Article "" by Michael Xinsheng Huang
  • Article "" by David Geary
  • Article "" by Mark Grand
  • CoR overview (页面存档备份,存于互联网档案馆

责任链模式, 此條目没有列出任何参考或来源, 2015年2月1日, 維基百科所有的內容都應該可供查證, 请协助補充可靠来源以改善这篇条目, 无法查证的內容可能會因為異議提出而被移除, 在物件導向程式設計裡是一种软件设计模式, 它包含了一些命令对象和一系列的处理对象, 每一个处理对象决定它能处理哪些命令对象, 它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象, 该模式还描述了往该处理链的末尾添加新的处理对象的方法, 目录, 代码示例, java, visual, prolog, 另見, 外部链接代码示例. 此條目没有列出任何参考或来源 2015年2月1日 維基百科所有的內容都應該可供查證 请协助補充可靠来源以改善这篇条目 无法查证的內容可能會因為異議提出而被移除 责任链模式在物件導向程式設計裡是一种软件设计模式 它包含了一些命令对象和一系列的处理对象 每一个处理对象决定它能处理哪些命令对象 它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象 该模式还描述了往该处理链的末尾添加新的处理对象的方法 目录 1 代码示例 1 1 Java 1 2 PHP 1 3 Visual Prolog 2 另見 3 外部链接代码示例 编辑Java 编辑 以下的日志类 logging 例子演示了该模式 每一个logging handler首先决定是否需要在该层做处理 然后将控制传递到下一个logging handler 程序的输出是 Writting to stdout Entering function y Writting to stdout Step1 completed Sending via e mail Step1 completed Writting to stdout An error has occurred Sending via e mail An error has occurred Writing to stderr An error has occurred 注意 该例子不是日志类的推荐实现方式 同时 需要注意的是 通常在责任链模式的实现中 如果在某一层已经处理了这个logger 那么这个logger就不会传递下去 在我们这个例子中 消息会一直传递到最底层不管它是否已经被处理 import java util abstract class Logger public static int ERR 3 public static int NOTICE 5 public static int DEBUG 7 protected int mask The next element in the chain of responsibility protected Logger next public Logger setNext Logger l next l return this public final void message String msg int priority if priority lt mask writeMessage msg if next null next message msg priority protected abstract void writeMessage String msg class StdoutLogger extends Logger public StdoutLogger int mask this mask mask protected void writeMessage String msg System out println Writting to stdout msg class EmailLogger extends Logger public EmailLogger int mask this mask mask protected void writeMessage String msg System out println Sending via email msg class StderrLogger extends Logger public StderrLogger int mask this mask mask protected void writeMessage String msg System out println Sending to stderr msg public class ChainOfResponsibilityExample public static void main String args Build the chain of responsibility Logger l new StdoutLogger Logger DEBUG setNext new EmailLogger Logger NOTICE setNext new StderrLogger Logger ERR Handled by StdoutLogger l message Entering function y Logger DEBUG Handled by StdoutLogger and EmailLogger l message Step1 completed Logger NOTICE Handled by all three loggers l message An error has occurred Logger ERR PHP 编辑 lt php abstract class Logger const ERR 3 const NOTICE 5 const DEBUG 7 protected mask protected next The next element in the chain of responsibility public function setNext Logger l this gt next l return this abstract public function message msg priority class DebugLogger extends Logger public function construct mask this gt mask mask public function message msg priority if priority lt this gt mask echo Writting to stdout msg n if false is null this gt next this gt next gt message msg priority class EmailLogger extends Logger public function construct mask this gt mask mask public function message msg priority if priority lt this gt mask echo Sending via email msg n if false is null this gt next this gt next gt message msg priority class StderrLogger extends Logger public function construct mask this gt mask mask public function message msg priority if priority lt this gt mask echo Writing to stderr msg n if false is null this gt next this gt next gt message msg priority class ChainOfResponsibilityExample public function construct build the chain of responsibility l new DebugLogger Logger DEBUG e new EmailLogger Logger NOTICE s new StderrLogger Logger ERR e gt setNext s l gt setNext e l gt message Entering function y Logger DEBUG handled by DebugLogger l gt message Step1 completed Logger NOTICE handled by DebugLogger and EmailLogger l gt message An error has occurred Logger ERR handled by all three Loggers new ChainOfResponsibilityExample gt Visual Prolog 编辑 这是一个用mutex保护对于stream的操作的真实例子 First the outputStream interface a simplified version of the real one interface outputStream predicates write writef string FormatString end interface outputStream This class encapsulates each of the stream operations the mutex The finally predicate is used to ensure that the mutex is released no matter how the operation goes i e also in case of exceptions The underlying mutex object is released by a finalizer in the mutex class and for this example we leave it at that class outputStream protected outputStream constructors new string MutexName outputStream Stream end class outputStream protected include pfc multiThread multiThread ph implement outputStream protected facts mutex mutex stream outputStream clauses new MutexName Stream mutex mutex createNamed MutexName false do not take ownership stream Stream clauses write mutex wait ignore wait code in this simplified example finally stream write mutex release clauses writef FormatString mutex wait ignore wait code in this simplified example finally stream writef FormatString mutex release end implement outputStream protected Usage example The client uses an outputStream Instead of receiving the pipeStream directly it gets the protected version of it include pfc pipe pipe ph goal Stream pipeStream openClient TestPipe Protected outputStream protected new PipeMutex Stream client Protected Stream close 另見 编辑Interception pattern Interceptor pattern Single responsibility principle外部链接 编辑Article The Chain of Responsibility pattern s pitfalls and improvements by Michael Xinsheng Huang Article Follow the Chain of Responsibility by David Geary Article Pattern Summaries Chain of Responsibility by Mark Grand CoR overview 页面存档备份 存于互联网档案馆 Behavioral Patterns Chain of Responsibility Pattern Descriptions from Portland Pattern Repository Apache Jakarta Commons Chain 取自 https zh wikipedia org w index php title 责任链模式 amp oldid 65687419, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。