学习心得---策略模式

策略模式(Strategy)定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

个人觉得这篇写的不错:http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html

大话设计模式-策略模式:http://www.cnblogs.com/cj723/archive/2007/03/21/682479.html

本文案例:已制造手机为例,首先定义手机基类PhoneBase,如图所示:该类有一个Call方法(拨打电话的基本功能);所有的手机都必须有拨打电话的功能,至于CPU、屏幕、键盘、触屏等等则是不同产品自己的特性了;像这些变化的东西不能封装到基类当中。那么我们需要定义成抽象类或接口。来封装这些变化的东西;

学习心得---策略模式_第1张图片
这里只写了列举了屏幕和CPU,这里定义了IScreen的接口,而Screen720P(720p高分屏)、Screen1080P(1080P高分屏)、ScreenOthers(其它类型屏幕)、这几个类分别实现IScreen接口,实现了对这些不同屏幕制造工艺的封装;CPU也是一样,定义了一个ICPU的接口。而CPU64(64位的CPU)、CPU64_2(64位的双核CPU)、CPU64_4(64位的4核CPU)、CPU64_8(64位的8核CPU)
学习心得---策略模式_第2张图片

lumia1520手机,厂家实际配置为:4核CPU、1080P高分屏、。。。。等等,实际代码如下:
        /// <summary>
        /// Lumia1520
        /// </summary>
        public class Lumia1520 : PhoneBase
        {
            /// <summary>
            /// CPU
            /// </summary>
            private ICPU _CPU;

            /// <summary>
            /// 屏幕
            /// </summary>
            private IScreen _Screen;


            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                StringBuilder strBuilder = new StringBuilder();
                strBuilder.AppendFormat("Lumia1520基本功能:{0}", Call());

                //CPU使用4核的
                _CPU = new CPU64_4();
                string cpu;
                cpu = _CPU.Create();
                strBuilder.AppendFormat("CPU:{0}", cpu);

                //屏幕使用1080p的
                _Screen = new ScreenOthers();
                string screen;
                screen = _Screen.Create();
                strBuilder.AppendFormat("屏幕:{0}", screen);


                return strBuilder.ToString(); 
            }
        }

Lumia1520,打电话的基本功能集成自PhoneBase,而CPU、屏幕变化的东西则来自相对应的CPU和屏幕型号类;
源码如下:
 /// <summary>
        /// lumia525
        /// </summary>
        public class Lumia525 : PhoneBase
        {
            /// <summary>
            /// CPU
            /// </summary>
            private ICPU _CPU;

            /// <summary>
            /// 屏幕
            /// </summary>
            private IScreen _Screen;


            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                StringBuilder strBuilder = new StringBuilder();
                strBuilder.AppendFormat("Lumia525基本功能:{0}", Call());

                //CPU使用4核的
                _CPU = new CPU64_2();
                string cpu;
                cpu = _CPU.Create();
                strBuilder.AppendFormat("CPU:{0}", cpu);

                //屏幕使用1080p的
                _Screen = new Screen1080P();
                string screen;
                screen = _Screen.Create();
                strBuilder.AppendFormat("屏幕:{0}", screen);


                return strBuilder.ToString();
            }
        }

        /// <summary>
        /// Lumia1520
        /// </summary>
        public class Lumia1520 : PhoneBase
        {
            /// <summary>
            /// CPU
            /// </summary>
            private ICPU _CPU;

            /// <summary>
            /// 屏幕
            /// </summary>
            private IScreen _Screen;


            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                StringBuilder strBuilder = new StringBuilder();
                strBuilder.AppendFormat("Lumia1520基本功能:{0}", Call());

                //CPU使用4核的
                _CPU = new CPU64_4();
                string cpu;
                cpu = _CPU.Create();
                strBuilder.AppendFormat("CPU:{0}", cpu);

                //屏幕使用1080p的
                _Screen = new ScreenOthers();
                string screen;
                screen = _Screen.Create();
                strBuilder.AppendFormat("屏幕:{0}", screen);


                return strBuilder.ToString(); 
            }
        }

        /// <summary>
        /// 手机基类
        /// </summary>
        public class PhoneBase
        {
            /// <summary>
            /// 拨打电话基本功能
            /// </summary>
            /// <returns></returns>
            public string Call()
            {
                return "拨打电话";
            }
        }

        /// <summary>
        /// cpu接口
        /// </summary>
        public interface ICPU
        {
            /// <summary>
            /// 制造
            /// </summary>         
            /// <returns></returns>
            string Create();
        }
        /// <summary>
        /// 64位单核CPU
        /// </summary>
        public class CPU64 : ICPU
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "64位单核CPU";
            }
        }

        /// <summary>
        /// 64位双核CPU
        /// </summary>
        public class CPU64_2 : ICPU
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "64位双核CPU";
            }
        }


        /// <summary>
        /// 64位4核CPU
        /// </summary>
        public class CPU64_4 : ICPU
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "64位4核CPU";
            }
        }

        /// <summary>
        /// 64位8核CPU
        /// </summary>
        public class CPU64_8 : ICPU
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "64位8核CPU";
            }
        }

        /// <summary>
        /// 屏幕
        /// </summary>
        public interface IScreen
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <param name="type">制造的类型</param>
            /// <returns></returns>
            string Create();
        }

        /// <summary>
        /// 生产720p高分屏
        /// </summary>
        public class Screen720P : IScreen
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "720p高分屏";
            }
        }

        /// <summary>
        /// 生产1080p高分屏
        /// </summary>
        public class Screen1080P : IScreen
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "720p高分屏";
            }
        }
        /// <summary>
        /// 生产其他屏幕
        /// </summary>
        public class ScreenOthers : IScreen
        {
            /// <summary>
            /// 制造
            /// </summary>
            /// <returns></returns>
            public string Create()
            {
                return "其他屏幕";
            }
        }

    }

写的不好不对的地方,请大家及时指正,谢谢。


你可能感兴趣的:(设计模式,C#,策略模式)