用Unity写设计模式

编程入门 行业动态 更新时间:2024-10-06 14:35:56

用Unity写设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式"/>

用Unity写设计模式

组合模式

    • 组合模式介绍
    • 组合模式
    • 组合模式案例1
    • 组合模式案例2

组合模式介绍

  • 定义

将对象组合成树形结构以表示“部分-整体”的层次结构,
使得用户对单个对象和组合对象的使用具有一致性。

组合模式

  • Component 组件(DrawingElement)

在组合中声明对象的接口。
为所有类的公共接口实现默认行为,视情况而定。
声明一个用于访问和管理其子组件的接口。
(可选)定义了一个接口,用于在递归结构中访问组件的父组件,并在合适的情况下实现它。

  • Leaf 叶(PrimitiveElement)

表示合成中的叶子对象。 一片叶子没有孩子。
为组合中的原始对象定义行为。

  • Composite 复合(CompositeElement)

定义有子组件的行为。
存储子组件。
在组件接口中实现子操作。

  • Client 客户机(CompositeApp)

通过Component接口操作组合中的对象。

using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;public class CompositeStructure : MonoBehaviour
{void Start ( ){// Create a tree structureComposite root = new Composite("root");root.Add(new Leaf("Leaf A"));root.Add(new Leaf("Leaf B"));Composite comp = new Composite("Composite X");comp.Add(new Leaf("Leaf XA"));comp.Add(new Leaf("Leaf XB"));root.Add(comp);root.Add(new Leaf("Leaf C"));// Add and remove a leafLeaf leaf = new Leaf("Leaf D");root.Add(leaf);root.Remove(leaf);// Recursively display treeroot.Display(1);}
}/// <summary>
/// The 'Component' abstract class
/// </summary>
abstract class Component
{protected string name;// Constructorpublic Component(string name){this.name = name;}public abstract void Add(Component c);public abstract void Remove(Component c);public abstract void Display(int depth);
}/// <summary>
/// The 'Composite' class
/// </summary>
class Composite : Component
{private List<Component> _children = new List<Component>();// Constructorpublic Composite(string name): base(name){}public override void Add(Component component){_children.Add(component);}public override void Remove(Component component){_children.Remove(component);}public override void Display(int depth){Debug.Log(new String('-', depth) + name);// Recursively display child nodesforeach (Component component in _children){component.Display(depth + 2);}}
}/// <summary>
/// The 'Leaf' class
/// </summary>
class Leaf : Component
{// Constructorpublic Leaf(string name): base(name){}public override void Add(Component c){Debug.Log("Cannot add to a leaf");}public override void Remove(Component c){Debug.Log("Cannot remove from a leaf");}public override void Display(int depth){Debug.Log(new String('-', depth) + name);}
}


组合模式案例1

using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;//这个真实世界的代码演示了Composite模式,
//用于构建一个由原始节点(线、圆等)和Composite组成的
//图形树结构节点(组成更复杂元素的绘图元素组)。namespace CompositePatternExample1
{public class CompositePatternExample1 : MonoBehaviour{void Start(){// Create a tree structure CompositeElement root =new CompositeElement("Picture");root.Add(new PrimitiveElement("Red Line"));root.Add(new PrimitiveElement("Blue Circle"));root.Add(new PrimitiveElement("Green Box"));// Create a branchCompositeElement comp =new CompositeElement("Two Circles");comp.Add(new PrimitiveElement("Black Circle"));comp.Add(new PrimitiveElement("White Circle"));root.Add(comp);// Add and remove a PrimitiveElementPrimitiveElement pe =new PrimitiveElement("Yellow Line");root.Add(pe);root.Remove(pe);// Recursively display nodesroot.Display(1);}}/// <summary>/// The 'Component' Treenode/// </summary>abstract class DrawingElement{protected string _name;// Constructorpublic DrawingElement(string name){this._name = name;}public abstract void Add(DrawingElement d);public abstract void Remove(DrawingElement d);public abstract void Display(int indent);}/// <summary>/// The 'Leaf' class/// </summary>class PrimitiveElement : DrawingElement{// Constructorpublic PrimitiveElement(string name): base(name){}public override void Add(DrawingElement c){Debug.Log("Cannot add to a PrimitiveElement");}public override void Remove(DrawingElement c){Debug.Log("Cannot remove from a PrimitiveElement");}public override void Display(int indent){Debug.Log(new String('-', indent) + " " + _name);}}/// <summary>/// The 'Composite' class/// </summary>class CompositeElement : DrawingElement{private List<DrawingElement> elements =new List<DrawingElement>();// Constructorpublic CompositeElement(string name): base(name){}public override void Add(DrawingElement d){elements.Add(d);}public override void Remove(DrawingElement d){elements.Remove(d);}public override void Display(int indent){Debug.Log(new String('-', indent) +"+ " + _name);// Display each child element on this nodeforeach (DrawingElement d in elements){d.Display(indent + 2);}}}
}

组合模式案例2

using UnityEngine;
using System.Collections;
using System.Collections.Generic;namespace CompositePatternExample2
{public class CompositePatternExample2 : MonoBehaviour{void Start(){SongComponent industrialMusic = new SongGroup("Industrial Music", "Industrial music is a genre of experimental music that draws on transgressive and provocative themes. The term was coined in the mid-1970s with the founding of Industrial Records by Genesis P-Orridge of Throbbing Gristle and Monte Cazazza; on Throbbing Gristle's debut album The Second Annual Report, they coined the slogan \"industrial music for industrial people\".");SongComponent heavyMetalMusic = new SongGroup("Heavy Metal Music", "Heavy metal is a genre of rock music[1] that developed in the late 1960s and early 1970s, largely in the United States and the United Kingdom.[2] With roots in blues rock and psychedelic rock,[3] the bands that created heavy metal developed a thick, massive sound, characterized by highly amplified distortion, extended guitar solos, emphatic beats, and overall loudness. Heavy metal lyrics and performance styles are often associated with masculinity, aggression, and machismo.[3]");SongComponent dubstepMusic = new SongGroup("Dubstep Music", "Dubstep /ˈdʌbstɛp/ is a genre of electronic dance music that originated in South London, England. It emerged in the late 1990s as a development within a lineage of related styles such as 2-step garage, broken beat, drum and bass, jungle, dub and reggae.[2] In the UK the origins of the genre can be traced back to the growth of the Jamaican sound system party scene in the early 1980s.[2][3] The music generally features syncopated drum and percussion patterns with bass lines that contain prominent sub bass frequencies.");SongComponent everySong = new SongGroup("Song List", "Every Song available");everySong.Add(industrialMusic);industrialMusic.Add(new Song("Head Like a Hole", "NIN", 1990));industrialMusic.Add(new Song("headhunter", "front 242", 1988));// see: here we are adding a group into a group and build up the hierarchy!!!!industrialMusic.Add(dubstepMusic);dubstepMusic.Add(new Song("Centipede", "Knife Party", 2012));dubstepMusic.Add(new Song("Tetris", "doctor P", 2011));everySong.Add(heavyMetalMusic);heavyMetalMusic.Add(new Song("War Pigs", "Black Sabath", 1970));heavyMetalMusic.Add(new Song("Ace of spades", "Motorhead", 1980));DiscJockey crazyLarry = new DiscJockey(everySong);crazyLarry.GetSongList();}}public abstract class SongComponent{public virtual void Add(SongComponent component) { }public virtual void Remove(SongComponent component) { }public virtual SongComponent Get(int index) { return null; }public abstract void DisplaySongInformation();}public class SongGroup : SongComponent{protected List<SongComponent> components = new List<SongComponent>();public string groupName { get; protected set; }public string groupDescription { get; protected set; }public SongGroup(string name, string description){this.groupName = name;this.groupDescription = description;}public override void Add(SongComponent component){components.Add(component);}public override void Remove(SongComponent component){components.Remove(component);}public override SongComponent Get(int i){return components[i];}public override void DisplaySongInformation(){Debug.Log(groupName + " - " + groupDescription);// now iterate through all groups inside this groupIEnumerator iterator = components.GetEnumerator();while (iterator.MoveNext()){SongComponent songComponent = (SongComponent)iterator.Current;songComponent.DisplaySongInformation();}}}public class Song : SongComponent{public string songName { get; protected set; }public string bandName { get; protected set; }public int releaseYear { get; protected set; }public Song(string name, string band, int year){this.songName = name;this.bandName = band;this.releaseYear = year;}public override void DisplaySongInformation(){Debug.Log("Song of " + songName + " - " + bandName + " : " + releaseYear);}}public class DiscJockey{protected SongComponent songList;public DiscJockey(SongComponent songList){this.songList = songList;}public void GetSongList(){songList.DisplaySongInformation();}}
}

更多推荐

用Unity写设计模式

本文发布于:2024-02-14 06:33:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762445.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   Unity

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!