结构型设计模式和行为型设计模式有什么区别?

43

我正在阅读关于设计模式基础的内容,并遇到了两种基本定义:结构模式和行为模式,具体如下:

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

行为设计模式:用于实体之间的通信,并使这些实体之间的通信更加简便和灵活。

阅读这些内容后,我无法区分它们之间的区别,请有经验的人给一些最简单的示例来指导我吗?


将行为视为外部于结构的场景。某个数据结构可以在多个行为/场景中“被使用”。 - Mihai Stancu
另一方面,将与结构相关的逻辑视为结构内部的逻辑。结构会受到各种变化的影响,并作为结果执行某些操作。 - Mihai Stancu
需要详细说明这个解释... - OM The Eternity
4个回答

28

最好的解释方式是通过来自两个不同类别的例子。

结构型模式中的组合模式定义了一种类似于树形结构的关系,因此侧重于关系。它具有一对多的关系类型,从而可以将整体和部分视为相同。

另一方面,行为设计模式中的观察者模式侧重于通信。我们如何让相关方知道对象发生的任何更改。类似于发布者和订阅者。它不定义严格的结构,但强制实现方法,即通信渠道。

希望这对您有所帮助。


7

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

将行为视为与结构外部的场景有关。某些数据结构可以在多个行为/场景中“被使用”。

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

话虽如此,我们可以用以下示例来说明:

结构设计模式将通过定义其组成部分(例如文章/图片/评论)作为高级业务对象来定义Web日志。这些组成部分知道彼此以及如何相互连接。

$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)定义博客的用例(场景)。这些业务对象不知道彼此,并且由场景逻辑“操纵”到其位置。

$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();

简短概括

如果存储对象是智能的(包含逻辑),这就是结构性设计。如果存储对象是愚蠢的(只能存储数据并将其传输到数据库),则需要行为设计来管理它们。


6
仍然不明白区别。 - OM The Eternity

3
抱歉,我的解释将会使用C#语言。
Observer是一种行为模式:提供接口,使对象能够相互通信,而不需要彼此了解具体信息。也被称为发布-订阅模式。对象可以告知其他对象其状态,而不需要知道这些对象是什么
Adapter是一种结构模式:适配器将给定类的接口转换为客户端请求的另一个类的接口。用一个新的接口包装现有类。在旧组件与新系统之间完成阻抗匹配。当由于不兼容的接口而无法使类一起工作时,它可以让类一起工作。
适配器示例:
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();
        }
    }
}

但在观察者模式中,观察者知道可观察对象,反之亦然。 - Al Xx

-1

结构型模式用于定义系统的静态属性(参见类图)。

例如:工厂模式可用于创建构成系统的实体。您可以拥有对象Button,在Windows和OS X上具有不同的图形属性。工厂模式将创建Button,而不考虑操作系统,并且所创建的对象将在两个操作系统上公开相同的接口,尽管内部不同,但表现出相同的行为

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

例如:适配器模式可在运行时使用,以透明地允许两个实体之间的接口,这两个实体之间没有共享接口。它有效地改变了对象的行为


6
工厂模式是创建型模式而不是结构型模式,适配器是结构型模式而不是行为型模式。 - Basemm
适配器模式是一种结构模式而非行为模式。 - Cod29

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接