C# & Unity 面向对象补全计划 七大原则 之 合成/聚合复用原则( CARP)难度:☆☆☆☆ 总结:在类中使用类,而不是继承类

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系

请看专栏: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 对象,没有利用继承关系,非常好用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值