C#之常用设计模式(unity版本)


                                                                  设计模式

一:设计模式之六大原则

六大原则是谁?
①单一职责原则 ②开放封闭原则 ③依赖倒置原则
④里式转换原则 ⑤接口隔离原则 ⑥迪米特原则
六大原则是我们提高面向对象编程代码质量的必备原则,另外还是我们理解设计模式的必备前提。


1.单一职责原则介绍:

单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。简单的说,就是一个类只负责一项职责(功能)。

简单点说:一个类只负责一件具体的事情,一个方法只完成一个特定的功能。当你发现一方法完成了两件事情的时候,就需要适当的重构成两个方法,类也是一样的。

在现实生活中有很多典型的例子体现出了单一职责:

比如:一个房子有客厅,有厨房,有卫生间,有卧室;每个房间都有自己“单一的职责/用途”。
 


2.开放封闭原则介绍:


开放封闭原则:软件实体(类,方法,模块)应该可以扩展,但是不可以修改。开放封闭原则简称为开闭原则。

比如说笔记本电脑:我们购买到的任何品牌的笔记本,都是“开放封闭”的。
封闭:整个笔记本是封闭的,且笔记本背部标明了“非专业人士,请勿试图拆卸
或者维修”以及“撕毁保修无效”的封条。
开放:指的是笔记本提供了若干个 USB 的插口,可供我们扩展。

简单分析:
笔记本本身具备键盘,触摸板,音响等功能,但是这些往往没有独立的外设好。
很多人会选择购买机械键盘,外置鼠标,外置音响,通过 USB 插口对笔记本原
有的功能进行扩展,这是一种正常的操作习惯,扩展而不是修改。
很少有人会在笔记本身上直接进行改动的,比如:把所有的键盘帽翘开,DIY
成机械键盘,拆开机器,更换一个更好的音响。如果你真这样做了,是有很大的
风险的,风险是你有可能破坏笔记本原有的结构,甚至出现大量的潜在风险。

 


3.依赖倒置原则介绍:


依赖倒置原则:针对抽象编程,不要针对实现编程;
高层模块不应该依赖于底层模块,两个模块都应该依赖于抽象(抽象类/接口)。

依赖倒置原则案例:
案例介绍:一个中国人和一个美国人上网,他们都需要搜索,聊天,看视频,但是他们上网的方式不同,比如美国人搜索用Google、聊天用MSN、看视频用Youtube,而中国人搜索用百度、聊天用QQ或者微信、看视频用腾讯或者爱奇艺,这个时候我们就可以引入依赖倒置原则

代码演示:

C#之常用设计模式(unity版本)
C#之常用设计模式(unity版本)

C#之常用设计模式(unity版本)

C#之常用设计模式(unity版本)

4.里氏转换原则介绍:


①一个软件实体如果使用的是一个父类的话,那么一定适用于其子类。而且它察
觉不出父类对象和子类对象的区别。
②在软件里面,把父类都替换成它的子类,软件的行为没有变化;简单点说,子
类型必须能够替换掉它们的父类型。

比如说:Unity 引擎是一个父类,Unity4.x,Unity5.x,Unity2017.x 都是这个父类下的子类。本身具备父类
的功能,同时又都有自己的新功能。

里氏转换原则名称的由来:
国外一位姓“里”的女士发表出来的数学理论,该理论最终以发表者的名字命名。
这种以发表者的名字进行命名的概念有很多,比如:牛顿定律,笛卡尔坐标系。


5.迪米特原则介绍:


迪米特原则:也叫做最少知识(知道)原则。
①如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
如果其中一个类需要调用另外一个类的某一个方法的话,可以通过第三者转发这
个调用。
②一个对象应当对其他对象有尽可能少的了解。

③迪米特原则主要是强调了类与类之间的松耦合。
类与类之间的耦合度越低,越有利于代码的复用,一个处于低耦合的类被修改了,
不会对有关系的类造成影响。

比如说:很多公司的董事长都会有自己的助理(秘书),负责帮自己处理公司的零散事情。
比如说:公司需要开会,如果没有助理,那么董事长需要亲自去通知所有的员工;
但是如果有助理,只需要把开会这件事告诉助理,然后董事长就不需要管了,助
理会去通知所有的员工。
在董事长和公司员工之间,多出来了一个助理,就可以降低董事长和公司员工之
间的耦合度,这样可以提高董事长的时间价值和效率。
没有助理:董事长需要面对 N 个员工,1 对 N 的关系;
有了助理:董事长只需要面对助理 1 人,1 对 1 的关系;然后由助理去 1 对 N。

迪米特原则案例演示:
  使用代码模拟董事长,员工,助理之间的关系。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// EmployeeManager(员工管理器).
/// </summary>
public class EmployeeManager : MonoBehaviour {
 
    private Transform _Transform;
    private GameObject prefab_Employee;
    private List<GameObject> allEmployeeList = new List<GameObject>();
 
    void Start()
    {
        _Transform = gameObject.GetComponent<Transform>();
        prefab_Employee = Resources.Load<GameObject>("Employee");
        CreateAllEmployee();
    }
    /// <summary>
    /// 创建所有员工.
    /// </summary>
    private void CreateAllEmployee()
    {
        for(int i = 0; i < 10; i++)
        {
           GameObject go= GameObject.Instantiate<GameObject>(prefab_Employee,new Vector3(i*1.5f,0f,0f),Quaternion.identity,_Transform);
            allEmployeeList.Add(go);
        }
    }
    /// <summary>
    /// 通知员工开会.
    /// </summary>
    public void SendMessageEmployeeMeeting(string time)
    {
        for(int i = 0; i < allEmployeeList.Count; i++)
        {
            allEmployeeList[i].GetComponent<Employee>().Meeting(time);
        }
    }