结构设计模式与行为设计模式的区别?

时间:2012-11-20 12:08:04

标签: design-patterns

我正在阅读设计模式的基础知识,并且遇到了结构模式和行为模式的两个基本定义,如:

结构设计模式:通常处理实体之间的关系,使这些实体更容易协同工作。

行为设计模式:用于实体之间的通信,使这些实体更容易,更灵活地进行沟通。

阅读它,我无法区分它们,有人可以通过给出一些最简单的例子来指导我们它们之间的区别吗?

4 个答案:

答案 0 :(得分:19)

解释的最佳方式是从两个类别中选择两个例子。

来自结构模式的复合定义了树状结构,因此关注于关系。一对多,并且具有一种关系,以便整体和部分可以被一视同仁。

观察者模式另一方面来自行为设计模式,侧重于沟通。我们如何让感兴趣的各方知道对象的任何变化。发布者到订阅者的排序。没有定义严格的结构,而是强制实施方法,即通信渠道。

希望它有用。

答案 1 :(得分:5)

我很不确定我的解释和例子是否真的涵盖了最重要的原则

将行为视为结构外部的场景。可以在多种行为/场景中“使用”某种数据结构。

另一方面,将结构相关逻辑视为结构内部。结构受到各种变化的影响,并因此执行一些操作。

话虽如此,我们可以举例说明:

结构设计模式将通过将其成分定义为更高级别的业务对象(如Article / Image / Comment)来定义Weblog。选民们彼此了解以及如何相互联系。

$image = new Image;
$image->title = 'Image title';
$image->url = 'http://example.com/file.ext';
$image->save(); // will save the image to a DB

$article->title = 'The title i have set';
/* $article->url_key = 'the_title_i_have_set'; */
// this ^^ element of logic will be done automatically by the article
$article->addImage($image); // will save the connection between the
                            // article and the image to DB

行为设计模式将使用较低级别的业务对象(例如Article / ArticleToImage / Image / ArticleToComment)通过其用例(场景)定义Weblog。业务对象彼此不了解,并由场景逻辑“操纵”到位。

$image = new Image;
$image->title = 'Image title';
$image->url = 'http://example.com/file.ext';
$image->save(); // will save the image to a DB

$article->title = 'The title i have set';
$article->url_key = $controller->getURlKey($article->title);
$article->save(); // saves article to DB

$article_to_image = new ArticleToImage;
$article_to_image->article = $article;
$article_to_image->image = $image;
$article_to_image->save();

TL; DR

如果存储对象是智能的(包含逻辑)结构设计。如果存储对象很笨(它们只能存储数据并将其传输到数据库),那么您需要一个行为设计来管理它们。

答案 2 :(得分:2)

很抱歉,我的解释将在C#中。

观察者是行为模式:呈现界面,允许对象在没有任何具体知识的情况下进行通信。也称为发布 - 订阅模式。用于通知其他对象有关其状态的信息,不知道这些对象

适配器是结构模式:适配器将给定类的接口转换为客户端请求的另一个类。使用新接口包装现有类。阻抗将旧组件与新系统匹配。由于接口不兼容,允许类一起工作。

适配器示例:

interface ITarget
{
  List<string> GetProducts();
}


public class VendorAdaptee
{
   public List<string> GetListOfProducts()
   {
      List<string> products = new List<string>();
      products.Add("Gaming Consoles");
      products.Add("Television");
      products.Add("Books");
      products.Add("Musical Instruments");
      return products;
   }
}


class VendorAdapter:ITarget
{
   public List<string> GetProducts()
   {
      VendorAdaptee adaptee = new VendorAdaptee();
      return adaptee.GetListOfProducts();
   }
}


class ShoppingPortalClient
{
   static void Main(string[] args)
   {
      ITarget adapter = new  VendorAdapter();
      foreach (string product in adapter.GetProducts())
      {
        Console.WriteLine(product);
      }
      Console.ReadLine();
   }
}

观察者示例:事件处理程序和只是事件

using System;
namespace wildert
{
    public class Metronome
    {
        public event TickHandler Tick;
        public EventArgs e = null;
        public delegate void TickHandler(Metronome m, EventArgs e);
        public void Start()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(3000);
                if (Tick != null)
                {
                    Tick(this, e);
                }
            }
        }
    }
        public class Listener
        {
            public void Subscribe(Metronome m)
            {
                m.Tick += new Metronome.TickHandler(HeardIt);
            }
            private void HeardIt(Metronome m, EventArgs e)
            {
                System.Console.WriteLine("HEARD IT");
            }

        }
    class Test
    {
        static void Main()
        {
            Metronome m = new Metronome();
            Listener l = new Listener();
            l.Subscribe(m);
            m.Start();
        }
    }
}

答案 3 :(得分:1)

结构模式用于定义系统的静态属性(请参阅Class diagram)。

示例:工厂模式可用于创建构成系统的实体。您可以在Windows与OS X上具有不同图形属性的对象Button。无论操作系统如何,工厂模式都将创建Button,并且创建的对象将在两个操作系统上具有相同的接口强烈的>相同的行为尽管有不同的内部结构。

行为模式用于定义系统的动态行为(参见ActivitySequence等图表。)

示例:可以在运行时使用适配器模式透明地允许两个不共享它们之间接口的实体的接口。它有效在运行时更改对象的行为