哲学原理Command模式使实践

by admin on 2018年11月15日

有的是年前,大一进校的时节,我青涩懵懂,校长激情演讲后引进了咱少本书,分别是《高功能人士的七个习惯》《专业主义》。第二上自己哪怕失书店买了立即有限本书,还一样并购回《做尽好之融洽(李开复)》《做协调想做的口(李践)》之类的数本干货。读着读着,我倍感自我之人生一样片光明。

一致、 需求分析

自信甚至自负的自亢奋了好巡,我幻想自己是“高功能人士”,觉得只要按书里说的来自然可以像高中时那么将到人生的高分。结果当然是黄。而且当自家发现自己并无是“高功能人士”的下,我不光不曾成立地去分析好问题发生在哪里,如何改善。而是我麻痹,找借口:因为我是一个从未“毅力”的人,这些业务是发出毅力的丁才能够做好的。这就是是胡自己读了这样多人生规划、时间管理,懂了这般多道理,还是过不好自己的人生的由来有。

于我们付出的一个品类遭到,需要好支付一个安系统,便于安排一定条件下的产品系统。要求的装置界面如图19-1所著:
 哲学原理 1
图19-1 安系统界面
基于安装步骤的异,所而实施的安逻辑吗呼应不同,然而客户要求的凡会提供“上亦然步”和“下一样步”的操作,以便让随时回退或者接续向前安装。这为是一般设置系统所应持有的效益。
基于对安工作的解析,整个安装共分为七单步骤:
(1)检测本地电脑连初始化安装系统;
(2)选择要装的压缩包;
(3)复制安装所用的临时文件;
(4)选定安装目录;
(5)准备安装;
(6)执行安装;
(7)安装成功,退出。
不折不扣安装步骤中,每一样步之安界面都非平等,而这些界面都出于特定的User
Control体现,例如User Control中的提示信息、按钮、进度长条等。

一. 气真的这么重要吗?

回复这个题材面前,我们来认一下坚的老三只特性:

1、意志力不是技巧。艺就是:前上我学会了蛙泳,今天自哉会见游,蛙泳是一个术。意志力却无是技术,前天自己失去矣健身房,不表示今天自家吧会坚称去健身房。意志力更像“肌肉”,长期坚持不懈锻炼,肌肉会变得还结实,但老未练,肌肉也会衰退。所以,你怎么练习肌肉,就要怎么练习意志力。起初你可品尝一些琐事来练意志力,然后有计划地逐步滋长难度,有计划地培育她。

2、意志力暨自我感觉、状态有很细心的涉及。如果今天而状态十分好,那么你去磨练的可能,就比较加班后麻烦得半坏时要非常丛。此外,当您觉得是深受外在压力逼迫时,人重新易放弃。

3、当我们打算坚持做一样件工作的时,意识力往往只能于峰几乎天从作用。别忘了坚定像肌肉,持续利用她会酸疼,很快便不起作用了。

那为什么小人好持续做相同起事格外多年,他们是安办到的?《坚持,一种好养成的惯》(下文简称《坚持》)《习惯的力量》给自己了问题的答案。《习惯的能力》打习惯的老三个要素入手告诉我们如何塑造习惯,替换习惯,识别习惯,培养意志力。《坚持》则根本出口习惯培养的老三个阶段,用科学的方法分别被起习惯培养的老三只级次不同的建议,并提出习惯引力和12个“持续开关”,给坚持增加助力。另外,《拖延心理学》将耽搁心理的深层原因的分析得稀密切,其中对心理学专业知识的任课也为自身打开一扇门,让我理解了过多题材并无是表面看上去的那粗略。

物为类聚的“黄书”

亚里士多德说:“人是为习惯所养的,优异的大成来于好好的惯,而未一时的履。”对习惯培养的强调都无例外了,大众也大期望通过养好习惯改变自己的人生,但实际上你针对习惯的认知还远远不够。(否则市面上吗无会见充满这么多毒鸡汤了,那些像“一生要养成的50只习惯,一生而扣押的xx,一生要明的xx…”里面的案列论证时毫无逻辑,瞎编乱造,小心掉坑。)下面我夹《坚持》《习惯的力》两本书的第一内容谈谈如何养习惯:

其次、 坏的宏图
既然如此我们为各国一个装步骤定义了不同之UserControl对象,那么在历次执行安装时,仅用以Pannel控件的续加子控件方法即可,例如定义如下的点子:
private void AddBodyUC(UserControl uc)
{
 panBody.Controls.Clear();
 panBody.Controls.Add(uc); 
 panBody.Refresh();
}
接下来我们直接以主窗体中定义若干推行安装之章程,且因安装的来头分类,例如:
private void PreviousStep1()
{}
private void NextStep1()
{}
俺们就定义一个计数器,用于记录安装步骤数:
private int step = 1;
同时,定义一个枚举类型,以指定安装之可行性是“上同一步”,还是“下一致步”:
public enum OpDirection {Previous=0,Next}
以调用更加简明,在实践安装的办法基础及,重又定义了同一系列之装方式,并接收OpDirection对象,根据其值以咬定执行之法门:
private void Step1(OpDirection direction)
{
 switch (direction)
 {
  case OpDirection.Previous:
   PreviousStep1();
   break;
  case OpDirection.Next:
   NextStep1();
   break;
 }
}
如今,我们尽管得一直当Button的Click事件受到调用相关的道了,例如:
private void btnNext_Click(object sender, System.EventArgs e)
{
  switch (step)
  {
   case 1: 
    Step1(OpDirection.Next);     
    break;
   case 2:
    Step2(OpDirection.Next);    
    break;
   case 3:
    Step3(OpDirection.Next);     
    break;
   case 4:
    Step4(OpDirection.Next);      
    break;
   case 5:
    Step5(OpDirection.Next);      
    break;
   case 6:
    Step6(OpDirection.Next);
    break;
   case 7:
    Step7(OpDirection.Next);
    break;
  } 
}
这样的筹划不可谓不略,然而也非可谓不拙劣了。实际上,这样的统筹实乃面向过程规划之流毒,而浑然不见了面向对象设计的精神实质。粗略列举一下,至少在以下缺陷:
(1)层次混乱,职责不明,众多落实代码都集中在一个主窗体类中,导致一个近乎过于庞大;
(2)逻辑虽然简易,然而代码却远繁杂,且不便利代码的复用;
(3)极度僵化,尤其不便民可能的扩充;
(4)思路混乱,结构模糊,不便宜代码的阅读,从而影响其他人对代码可能会见有的改。
总之,这样的规划仿若一个恶性的艺人胡乱敲于出去的同一项半成品,非但谈不达规划的美,竟然连最核心的计划性因素呢无具有。勉强可说,够用而已。
这就是说,应该如何设计才会克服以上之老毛病也?其实,从上述的计划着我们得找到有更上一层楼计划的头脑。最关键的统筹原则,还是对象的天职分开。例如我们考虑一下实行安装之章程,它们属于主窗体对象的天职范围为?答案显而易见是否定的。既然这些办法不属于主窗体对象的天职,为什么咱们还要将那个定义在主窗体类中呢?
那,这些点子究竟属于哪一个对象?是各国一个安步骤所定义的UserControl对象呢?似乎是,然而以不尽然。一个UserControl对象,它的职责应该是啊?虽然是啊顺序安装步骤定义的接近,然而她的职责重大还在于安界面的连锁逻辑,例如相关信息以界面及之显示,进度长达的快显示,还连Button响应Click事件所可能实行的方式。而实行安装,严格说来,却跟这些目标无关。
既找不至安装方式所属的目标,为什么未也那个特别定义相关的对象啊?思路及了此处,就发矣豁然开朗的欢快了。

二. 什么是习惯?

习以为常就是是把更的行动转化为无心的作为,就比如人脑中设定了先后,习惯让该自动化运行。心理学家说,人类95%底逯是于潜意识中进行的。因为表意识一糟只能处理同项事,所以当我们一方面学英语一边骑车的时,无意识就出来帮来了。

1. 每个习惯由三个部分,习惯的多变原理(habit loop)亦然:Cue(提示)→Routine(行为习惯)→Reward(回报)。比如说洗澡的习惯,提示就是感到不根本或浴霸,惯例就是洗澡,回报就是快意的感到。

2. 习惯是自动进行的。你道你是以做决定,其实仅仅是您的惯以CUE提示下自行进行了。你想吃零食了,是因您现在刚刚有点无所事事,懒散的发硌了若这个习惯。

3. 所以,好之惯就是是这么不自觉吃触发的,你免会见看费时要失去坚持什么,就能够顺其自然地持续做下。可是当大脑看来,它可是免清楚什么是好习惯,什么好习惯。所以坏习惯也一致会发出轮回的魔力,甚至吃你向停不下来!

三、 引入Command模式

三. 怎样塑造一个好习惯?

1.
规定好想造的惯后,为就这个行为找到想只要之“奖励”(回报)。奖励必须使明白、可视化,大到如和谐产生某种“渴望”,模糊的报是无可知导致习惯的多变的!

李笑来在《把日作为朋友》里来个案例是他透过计算,发现每背一个单词,自己就净赚了20片钱,于是要坐20只,一天便挣了400片!这种做法即使好坐单词之褒奖大益,于是为就是再次起动力背下去。

  1. 受好办一个简单易行易行的“触机”,触机产生,立即行动。

依您想养成健身的习惯,请不要失去制定过于复杂的计划,约私教、研究健身装备、器材什么的。其实越是简单易行的走动更轻得逞,比如下班回家马上跳15分钟郑多燕,触机就是优先摆在卧室里明显的舞蹈垫。为了为回报可视化,你得省略在墙上贴纸上记录自己之坚持天数和体重。甚至必将一个老实,如果相同圆坚持6天,就好于第七上拘留电影。

3.
重复、重复、重复,建立行为习惯。这种重新用有些时啊?不同之惯用之时并不相同,在不同的品获得持续的力之方式吗不相同。

《坚持》一开之经的处当叫,作者以大方案列的根底及,总结研究了一个习以为常于尝试到形成这进程用更“反抗期” “不稳当定期” “倦怠期”三单等级。针对各个一样等可能遇到的艰难及人们的思维影响进行解析,并因而实际的案例介绍了相应措施。

比方说一个突出的对象应当包括属性和行事,那么单纯包含行为之靶子,毋庸置疑最佳的定义类型就是接口了。在高达同样节约的设计方案中,定义了同样层层安装方式,虽然步骤不同,执行的逻辑吗非同等,然而由于所有相同的方法签名,因此完全好合啊一个接口,例如ISetupCommand:
public interface ISetupCommand
{
     void ExecuteSetup();
}
既是是基本上独装步骤都装有该Setup()方法,自然就是足以定义相关的切近,并设该落实该接口:
public class Step1SetupCommand:ISetupCommand
{
     public void ExecuteSetup()
     {
     //实现略;
     }
}
如此一来,修改后的设计其类图如图19-2所展示:
 哲学原理 2
希冀19-2 ISetupCommand类型的类图
熟识设计模式的读者应当可以看到,上图所示就是一个业内的Command模式实现。确实这样,我们以设置方式看作是一个用户的恳求,或者说是命令。由于拖欠令逻辑对于网而言是转的,因此抽象该令逻辑,使该及任何调用者之间的耦合度松散,是缓解这仿佛题目之特等方案。
小心:如果比较接近图结构,我们会意识Command模式、Strategy模式和State模式是一心一致的。事实正是如此,由于它的规划思想都是指向易变动之一些开展抽象,或为接口,或也抽象类。唯一的区别,就是所抽象的行为职责不同而已,这无异碰于各自的讳就可以看出。本例中,由于设置方式还接近于用户之乞求或指令,所以称其也Command模式更方便。
引入Command模式真的使我们的程序结构更加合理了,然而,我们以设计模式,并无是一旦挺搬硬套,而相应按其计划的中心标准。以本例而言,实则我们没有必要定义诸如Step1SetupCommand的接近,来兑现ISetupCommand接口。我们才待改原来也顺序安装步骤定义之UserControl类,令该促成ISetupCommand接口即可。
如此说来,安装行为依然属于UserControl的天职也?这怎么不是跟前方的解析由相抵触?其实不然,两者之间有着截然不同的别。如果只是将装方式简便地放UserControl对象吃,则该任务是跟具象的UserControl类型相绑定的,例如Step1BodyUC类对象,它们的涉是同种植胜似赖关系。由于UserControl类项目是.Net
Framework已经定义好之,虽然各个具体的UserControl对象来一个同台之基类UserControl,然而安装方式可未曾受一起抽象出来,也就是凡说,各个UserControl对象的安方式是各自为政的,因此如下的代码就是不当的:
UserControl uc = new Step1BodyUC();
uc.ExecuteSetup();
只有将对象uc进行亮转换为Step1BodyUC类型,然而如此的拍卖就完全悖离了面向对象思想中之多态性。
若是是各个UserControl对象清一色实现ISetupCommand接口,情况就算了不同了:
public class Step1BodyUC:UserControl,ISetupCommand
{
 //实现略;
}
以下代码是合情合理的:
ISetupCommand uc = new Step1BodyUC();
uc.ExecuteSetup();
修改后底设计方案类图应该要图19-3所显示:
 哲学原理 3
祈求19-3 修改后底设计类图
对比首的筹划,我们就新加了一个ISetupCommand接口,同时以原先在主窗口类中的装置方式,转移到了一一UserControl对象中,作为ISetupCommand接口方法的贯彻。

四. 如何过习惯的老三单等级

以下为单纯需要一个月份即可以形成的行为习惯为条例,简单说说其三个阶段你还见面遇上什么困难。行为习惯是乘每天规律的所作所为,比如看、写作、记账、运动之类,这是三种植习惯吃极好养的,大约用30龙。身体习惯和思考习惯请在行为习惯的功底及添各等所欲时。

季、 进一步完善

1、(第一路)反抗期:想放弃—— 一定要是撑下去

倒抗期常常是第1~7上,在案例统计中失败率是三个阶段中最高的42%。由此可见“三分钟热度”的场面的确很常见。相反抗期其实是“习惯引力”在由作用。因为每个人都发“对抗新变化,维持现状”的特征。而突然接到了初的指令,你就想反抗一下,维持以舒适区里,不思量接受新东西。表现出来的状况就是是,各种搜索借口放弃培养习惯。

策一:从小地方开始。即设定好推行之秘诀,抛开不足、完美主义,保持每日不断走。因为只有每天穿梭行动才是对抗习惯引力的特级艺术。这个等级,即使成功的质量不好,也能够起至根本的用意。比如下班回家原计划是整女人40分钟的,但是既然已不行烦的,那整理15分钟呢未尝不可。

策二:简单记录

◆不要过于繁琐:配合目的,把记录的内容减交最少,记录之家伙而在方便填写的地方还是随身携带。

◆一定要每天记下,持续记录可知改进作为模式、提高动力。因为记录得帮忙您合理地剖析、了解问题,减少行动的不确定性,提高动力。

可随身携带的记录本

虽程序结构在引入Command模式后有矣要命怪的更改,然而现有的逐一ISetupCommand对象并无可知十分好地给主窗体对象所调用。在为btnNext和btnPrevious按钮的Click事件实现设置行为经常,安装步骤必须是各个执行的,而现之统筹,并无可知反映这样一个逐项关系。唯一的点子,是用这些ISetupCommand对象依次放入一个集合对象中,并提供Next()和Previous()方法,返回正确的目标:
 public class SetupUCChain
   {
        private List<ISetupCommand> m_list;
        private int m_step;
        private static SetupUCChain m_chain;
        private SetupUCChain()
        {
            m_list = new List<ISetupCommand>();
            m_step = 0;
            Init();
        }
        public static SetupUCChain CreateSetupUCChain()
        {
            if (m_chain == null)
            {
               return new SetupUCChain();
            }
            else
            {
                return m_chain;
            }
        }
        private void Init()
        {
            m_list.Add(new Step1BodyUC());
            m_list.Add(new Step2BodyUC());
            m_list.Add(new Step3BodyUC());
            m_list.Add(new Step4BodyUC());
            m_list.Add(new Step5BodyUC());
            m_list.Add(new Step6BodyUC());
            m_list.Add(new Step7BodyUC());
        }
        public ISetupCommand Next()
        {
            ++m_step;
            if (m_step < m_list.Count)
            {
                return (ISetupCommand)m_list[m_step];
            }
            else
            {
                throw new IndexOutOfRangeException(“Setup is
completed.”);
            }
        }

2、(阶段2)不妥当定期:容易被影响——建立能够不断下去的体制

未服帖定期常常是第8~21天,这时候你会非常轻吃各种突发情况打扰到您的计划,从而感到“今天勿做也不曾提到吧”,失败率高臻40%。在此路,我们不仅使白手起家行动机制以习惯坚持下,还要在成功质量上,达到原来计划要求的水平,尽量不再用“从小地方开”的艺术降低完成难度。所以这个路真的蛮有挑战性。但是若成立了定位的走节奏,身体就是可知适应“不开特别”的状态。

策略一:把想只要树的惯成永恒的模式(时间、做法、地点),并认真实施

管制定好之所作所为模式表贴在赫的地方

◆尽量找有无让侵害的“圣地”:最好使用非轻给工作或者私事影响之时空。可能同样开始大不便完成最好好,不过可以当实际在面临多方面尝试,找到最佳行为模式。

◆考虑一举两得的做法:如果拿行动安排在上班路上可能午休时间,就不需呢培训习惯外安排时了。

◆每天穿梭走,培养节奏感:可以安排“每周一、三、五、日”、“每周二、四、六”分别召开啊业务。

谋略二:设定不同规则

凭计划又怎么周全,我们且挺为难百分百地履行,所以,需要设定不同规则,让计划保持弹性。设定不同规则时,需要遵循两只重大:假设可能发生的两样状况;一边尝试一边改“例外规则”,如果发生意料之外的景,就设定新的“例外规则”。准备好不同事件来后底答疑方式,可以给你再发生弹性地实施计划,减少压力。

A:以“从小地方开始”的点子行进

B:替换(如果以某一时间段加倍完成目标,可以拿其它一样时光段预留出来,不开另外安排)

C:设定特别之小日子(比如周日或者节假日,空有同样龙未做安排)

策略三:设定持续开关

“持续开关”是善培养习惯的食指以能持续行动所计划的部分都行的章程。作者以书被列有了养其他习惯都适用的12个“持续开关”,你可以于询问自己之底子及进展选择。而且不同的习惯有异之“开关”:每树一个新习惯时,请好地思量,选出最契合自己的“持续开关”。把“开关”组合于行走中,建立从一模拟行为机制,这样就能循环不断走了。

        public ISetupCommand Previous()
        {
            –m_step;
            if (m_step >= 0)
            {
                return (ISetupCommand)m_list[m_step];
            }
            else
            {
                throw new IndexOutOfRangeException(“No previous
step.”);
            }
        }
  }
考虑到SetupUCChain对象极其多只能实例化一不良,因此自于此引入了Singleton模式。
最终,由于在分别的装置方式中,需要用UserControl本身上加到主窗体Pannel控件的分层控件被,我们尚亟需改ISetupCommand的接口方法,从参数传入Pannel控件对象:
public interface ISetupCommand
{
     void ExecuteSetup(Pannel pannel);
}
那当逐个UserControl对象被,需要以原本的设置方式实现中补充加如下的代码:
panel.Controls.Add(this);
而今,对于btnPrevious和btnNext按钮的Click事件而言,逻辑就是非常简单了:
public class SetupMainForm:System.Windows.Forms.Form
{
     private System.Windows.Forms.Panel panBody;
    private SetupUCChain m_chain = SetupUCChain.CreateSetupUCChain();
    //中间代码略;
private void btnNext_Click(object sender, System.EventArgs e)
{
  try
  {
  m_chain.Next().ExecuteSetup(panBody);
  }
  catch (IndexOutOfRangeException ex)
  {
  MessageBox.Show(ex.Message);
  }
     }
private void btnPrevious_Click(object sender, System.EventArgs e)
{
  try
  {
  m_chain.Previous().ExecuteSetup(panBody);
  }
  catch (IndexOutOfRangeException ex)
  {
  MessageBox.Show(ex.Message);
  }
     }
}
经引入设计模式,运用职责分开的法则,我们拿与安装有关的逻辑剥离出主窗体类定义,使得所有结构清晰简要,职责明确,且因对或有的转移进行了包,同时也保有了而扩展性,形成了结构中的松懈耦合。这样的到规划的成套过程尽管会损耗我们种开发的流年,然而付出的用力并从未没有,改善后的组织才是健全的、逻辑清楚的,同样也是雅的规划。

3、(阶段3)倦怠期:感到腻烦——用转变打破倦怠

绵绵一件事好了第22~30龙,难免会发厌恶。起初为什么而坚持做这宗事的初心已记不清得几近了,坚持了这样绵长却没看立竿见影的功力从而啊稍动摇了。所以就算坚持到了本,胜利在望的下还会发出一对丁马失前蹄,失败率为18%。

谋一:让习惯来点转,打破倦怠。花点心思为习惯增加点什么,以新的情怀还出发。如果发现自己不够动力了,可以花5分钟思考一下:如果我每天坚持看30分钟,3年晚会咋样?假而读一本书要3小时,如果每个月份阅读了15单小时,那三年尽管是180按。如果您的开卷比较集中,三年晚若尽管是有世界的专业人士了!

IHOUR让您懂您及10000时的离开

◆以“一举两得”的角度想:通过一个习以为常得到两倍增收获。例如,一边听英文一边收拾、一边听出声书一边跑……

◆准备多摘:变化更为丰富越好,建议至少要优先想吓三单可以挑选的动。

◆不要轻易改变模式或规则:中途改变不服帖定期所成立之一言一行模式或者“例外规则”,极容易摧毁已经确立之惯节奏。不过,在表现模式面临,更改场地或内容是没涉嫌的。

策略二:计划下同样码习惯:在倦怠期最后阶段计划下一致起习惯就是为建习惯的连贯性。

◆把目标倒过来计算:针对事先度高的习惯,重新检视之前填的“习惯的年度计划”清单。

◆拟定计划:为了造“习惯化”的力量,用新的干活清单拟定计划。

五.怎样改变一个坏习惯?

1.
推倒旧习惯更建新习惯的难度,大于当旧习惯及展开调。所以,逐步微调你的惯是个好法子。比如你要改少睡懒觉的惯,那么就是一点一点渐提前起床时吧。

  1. 保留原的“触机”和“奖励”,但调而的“惯性行为”

3.
审的惯改,不能够差信念。在遇见重大挑战时,好不容易培养的好习惯恐怕土崩瓦解,坏习惯卷土又来。这时候可能您要获得信念。你可就此写日记的点子鼓励自己,但如果。你能博取团体的支撑、好友的鞭策就再也好了。

六. 意识自己的习惯 

森时分的问题在于,我们无亮堂自己的习惯是啊,每天举行了扳平堆放事情睡前同想接近也没召开啊,你虽那习惯性地开了。或者,知道好产生一个坏习惯,但未晓得之习惯是怎形成的。《习惯的力》给闹了一个四步建议,非常实用。

1、了解自己的习惯性行为。比如,行为是:你每天晚上就会见无自觉地圈网络小说。

2、通过尝试了解自己这习惯背后真正的“回报”是什么。很多时节报可能坏隐晦,所以不便觉察。测试一下,如果夜晚自我非看网络小说,而是去听音乐,听罢音乐本身还见面惦记看网络小说吗?如果还眷恋看,那说明听音乐无法做到看小说带来的回报。如果非思看网络小说了,那该就是是一模一样的报恩了。

3、找到触机(cue)。到底是呀触发了若晚上羁押网络小说的渴望也?一般的话,触机会有时空(time)、地点(location)、情绪状态(emotional state)、人物(other people)、前同一步行为(immediately preceding action)这几种。我们一样可透过以每次行为发出时记下这的情,来辨别触机。比如总是记录后,你意识每次想看小说还是夜里无所事事的早晚,或者睡前。

4、制定计划。就如前说的,保留触机和奖赏,只是改变习惯性行为比轻。所以你得对地培训一个初的习惯来替代前的习惯:每当夜幕无所事事时,你就算开辟音乐,放空自己,来平等段心灵旅行。

为什么你掌握了成千上万,却照样过不齐惦记使之生?因为行知不一,王阳明说:“知行合一,止于至善”,可见从古至今行动力、执行力的题目一直是只难以解决的问题。明明道理很简单,是否能好以是另一回事了。是什么阻挡了您进行行动,你是不是清楚答案吧?


Looka作于2016年5 21

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图