设计模式实践——IOC模式

IOC模式 又被称为依赖倒置模式。  它将原本调用者类+功能类 的耦合关系改成 调用者类+中间类、中间类+功能类。

下面开始 从简单模式开始一步一转换为IOC模式:

1 简单的调用者加两个功能类。相互间耦合紧密

namespace DesignModeApp.IOC.Ver1_Nomal
{
    
    class OperationMain
    {
        public void PalyMedia()
        {
            Player player = new Player();
            MediaFile file = new MediaFile();
            file.FileName = "C:\\Music.mp3";

            player.Play(file);
        }
    }

    class Player
    {
        public void Play(MediaFile file)
        {
            Console.WriteLine("Play:" + file.FileName);
        }
    }

    class MediaFile
    {
        public string FileName;
    }
}

2 使用接口、基类来解耦合

namespace DesignModeApp.IOC.Ver2_Interface
{
    class OperationMain
    {
        public void PalyMedia()
        {
            IPlayer player = new Player();
            IMediaFile file = new MediaFile();
            file.FileName = "C:\\Music.mp3";

            player.Play(file);
        }
    }

    interface IPlayer
    {
         void Play(IMediaFile file);
    }
    class Player: IPlayer
    {
        public void Play(IMediaFile file)
        {
            Console.WriteLine("Play:" + file.FileName);
        }
    }

    interface IMediaFile
    {
        string FileName { get; set; }
    }

    class MediaFile: IMediaFile
    {
        public string FileName { get; set; }
    }
}

3 使用IOC模式,利用配置文件来控制功能类的实例化:

namespace DesignModeApp.IOC.Ver3_IOC
{
    class OperationMain
    {
        public void PalyMedia()
        {
            string namespce_String = ConfigurationManager.AppSettings["NameSpace"];
            string name_Player = ConfigurationManager.AppSettings["IPlay_Name"];
            string name_MediaFile = ConfigurationManager.AppSettings["IPlay_Name"];

            IPlayer player = (IPlayer)Assembly.Load(namespce_String).CreateInstance(name_Player);
            IMediaFile mediaFile = (IMediaFile)Assembly.Load(namespce_String).CreateInstance(name_MediaFile);
            

            player.Play(mediaFile);
        }
    }

    interface IPlayer
    {
        void Play(IMediaFile file);
    }
    class Player : IPlayer
    {
        public void Play(IMediaFile file)
        {
            Console.WriteLine("Play:" + file.FileName);
        }
    }

    interface IMediaFile
    {
        string FileName { get; set; }
    }

    class MediaFile : IMediaFile
    {
        public string FileName { get; set; }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="NameSpace" value="DesignModeApp"/>
		<add key="IPlay_Name" value="IOC.Ver3_IOC.Player"/>
		<add key="IMediaFile_Name" value="IOC.Ver3_IOC.MediaFile"/>
	</appSettings>
</configuration>

4 最后使用依赖注入技术(Unity 库)。同时修改调用类 的构造函数。从而用构造参数来设置 功能类。尽管不知道这有什么用。

namespace DesignModeApp.IOC.Ver4_DI
{
    class Program
    {
        static UnityContainer container = new UnityContainer();
        static void Init()
        {
            container.RegisterType<IPlayer, Player>();
            container.RegisterType<IMediaFile, MediaFile>();
        }

        static void Run()
        {
            Init();

            OperationMain op1 = container.Resolve<OperationMain>();
            op1.PalyMedia();

        }
    }
    class OperationMain
    {
        IPlayer _player;
        IMediaFile _mediaFile;
        public OperationMain(IPlayer player, IMediaFile mediaFile)
        {
            _player = player;
            _mediaFile = mediaFile;
        }

        public void PalyMedia()
        {
            _player.Play(_mediaFile);
        }
    }

    interface IPlayer
    {
        void Play(IMediaFile file);
    }
    class Player : IPlayer
    {
        public void Play(IMediaFile file)
        {
            Console.WriteLine("Play:" + file.FileName);
        }
    }

    interface IMediaFile
    {
        string FileName { get; set; }
    }

    class MediaFile : IMediaFile
    {
        public string FileName { get; set; }
        public MediaFile()
        {
            FileName = "C:\\Music.mp3;";
        }
    }
}

参考博客:

作者:Qlin 出处:Qlin - 博客园

IoC模式(依赖、依赖倒置、依赖注入、控制反转) - GavinJune - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值