本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺
1.合成/聚合复用原则( CARP)
合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的
说白了,类和类之间方便互通的话就少用点继承,这样会减少耦合,提高灵活性
合成(Composition):表示强的“拥有”关系,新对象包含了已有对象,成为其一部分,例如,大雁有两个翅膀,翅膀与大雁是合成关系,它们的生命周期一样
聚合(Aggregation):表示弱的“拥有”关系,新对象可以包含已有对象,但已有对象不是新对象的一部分,例如,大雁属于一个雁群,雁群可以有多只大雁,所以大雁和雁群是聚合关系
2.举栗子
假设我们正在开发一个游戏,其中有不同类型的武器和角色,我们希望设计一个灵活的系统,以便在游戏中组合不同的武器和角色,而不是通过继承来实现复用
首先,我们定义以下几个类:
Weapon
类表示武器,它具有属性如攻击力、射程、弹药等
Character
类表示角色,它包含属性如姓名、生命值、装备的武器等最后一个类表示玩家,需要角色的属性以及武器的基本信息
using System;
using System.Collections.Generic;
class Weapon
{
public string Name { get; set; }
public int AttackPower { get; set; }
public float Range { get; set; }
}
class Character
{
public string Name { get; set; }
public int Health { get; set; }
public Weapon EquippedWeapon { get; set; }
}
class Player
{
public string Username { get; set; }
public List<Character> Characters { get; set; }
public Player(string username)
{
Username = username;
Characters = new List<Character>();
}
public void AddCharacter(Character character)
{
Characters.Add(character);
}
}
class Program
{
static void Main()
{
// 创建武器
var sword = new Weapon { Name = "Sword", AttackPower = 50, Range = 2.0f };
var bow = new Weapon { Name = "Bow", AttackPower = 40, Range = 10.0f };
// 创建角色
var warrior = new Character { Name = "Warrior", Health = 100, EquippedWeapon = sword };
var archer = new Character { Name = "Archer", Health = 80, EquippedWeapon = bow };
// 创建玩家
var player = new Player("Player123");
player.AddCharacter(warrior);
player.AddCharacter(archer);
// 输出信息
Console.WriteLine($"Player: {player.Username}");
foreach (var character in player.Characters)
{
Console.WriteLine($"Character: {character.Name}, Health: {character.Health}, Weapon: {character.EquippedWeapon.Name}");
}
}
}
该例子将已有的 Weapon
和 Character
对象组合成了 Player
对象,没有利用继承关系,非常好用