Oracle 中UNDO与REDO的区别详解

    学习设计模式已经有段时间了,初接触设计模式,尽管例子简单、生动,但还是感觉很是抽象。今天又学习了设计模式中的装饰模式,也就是装饰模式让自己对模式略有所懂,装饰模式最大的特点就是把所有需要的功能都按正确的顺序串联起来进行控制。这里需要强调的是“顺序”,也就是说这种装饰是建立在一定的顺序之上的,而且这种顺序是由人为控制的;不同于建造者模式,它的顺序是固定不变的。

**概念

    动态地给一个对象添加一些额外的职责,就增加的功能来说,装饰模式比生成子类更为灵活。

**结构图

    Component是定义了一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,抽象装饰类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcretrDecorator就是具体的装饰对象,起到给Component添加职责的功能。

**实例解析

   
下面以小明(代码中的具体对象)的着装为例,进行具体解析:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 装饰模式_终极版_
{
    class Program
    {
        //Person类
        class Person
        {
            public Person()
            { }

            private string name;
            public Person(string name)
            {
                this.name = name;
            }

            public virtual void show()
            {
                Console.WriteLine("装扮的{0}", name);
            }
        }

        //服饰类
        class Finery : Person
        {
            protected Person component;

            public void Decorate(Person component)
            {
                this.component = component;
            }

            public override void show()
            {
                if (component != null)
                {
                    component.show();
                }
            }
        }

        //具体服饰类
        class Tshirts : Finery
        {
            public override void show()
            {
                Console.Write("大体恤");
                base.show();
            }
        }

        class BigTrous : Finery
        {
            public override void show()
            {
                Console.Write("垮裤");
                base.show();
            }
        }

        class Sneakers : Finery
        {
            public override void show()
            {
                Console.Write("破球鞋");
                base.show();
            }
        }

        class Suit :Finery
        {
            public override void show()
               {
 	            Console.Write("西装");
                base.show();
                }
        }
        class Tie : Finery
        {
            public override  void show()
            {
            Console.Write("领带");
            base.show();
            }

        }

        class LeatherShoes:Finery
        {
            public override void show()
            {
                Console.Write("皮鞋");
                base.show();
            }

        }
        static void Main(string[] args)
        {
            Person xc = new Person("小明");

            Console.WriteLine("\n第一种装扮:");

            Sneakers pqx = new Sneakers();
            BigTrous kk = new BigTrous();
            Tshirts dtx = new Tshirts();

            pqx.Decorate(xc);
            kk.Decorate(pqx);                                //装饰过程
            dtx.Decorate(kk);
            dtx.show();

            Console.WriteLine("\n第二种装扮:");

            LeatherShoes px = new LeatherShoes();
            Tie ld = new Tie();
            Suit xz = new Suit();

            px.Decorate(xc);
            ld.Decorate(px);                                //装饰过程
            xz.Decorate(ld);
            xz.show();

            Console.Read();
        }
    }
}

    

在这个例子中并没有抽象的Component类,将其和ConcreteComponent类合并为“人”的类,具体结构图如下:

运行的具体结果为:

              

    在这里为什么会出现这样的结果,为什么会是这样的“打扮”,又是为什么出现了这样的顺序,接下来将为您做详细的介绍(以第一种装扮为例):

    Sneakers实例化了pqx ,BigTrouser 实例化了kk,TShirts实例化了dtx。然后pqx包装xc(也就是这个例子中的小明),kk包装pqx,dtx包装kk,最后执行dtx.Show(),按照实例化的相反顺序依次实现了对xc的包装,也就是以上截图中显示的结果。

**优点

    ①把类中的装饰功能从类中搬移去除,这样可以简化原有的类;

    ②有效地把类的核心职责和装饰功能区分开来,而且可以去除相关类中重复飞装饰逻辑;

**遗憾

    尽管对装饰模式有了些许了解,但是对于装饰过程部分还有诸多的不理解,希望大家多多指教,鄙人在此谢过了。

Oracle 中UNDO与REDO的区别详解

时间: 2024-10-21 02:17:31

Oracle 中UNDO与REDO的区别详解的相关文章

PHP中include和require的区别详解

1.概要  require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句).这就意味着如果可能执行多次的代码,则使用require()效率比较高.另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句. require的使用方法如:require("myfil

javascript中undefined和null的区别详解

一.问题的由来 永远不要直接使用undefined进行变量判断使用字符串"undefined"对变量进行判断 这里,undefined是原始值,在JS中undefined出现只有两种情况,一种是变量未定义.一种是定义了变量,但是没有赋值. 如果这个地方person未定义,那么利用person===undefined全等判断就会报错,person未定义但是如果使用typeof来判断,那么就不会报错了. ep: alert(person == undefined);//报错 person

Oracle 中UNDO与REDO的差别具体解释

一 为了更清楚的看出2者差别,请看下表: UNDO                                                                   REDO Record of How to undo a change How to reproduce a change Used for Rollback, Read-Consistency Rolling forward DB Changes Stored in Undo segments Redo log

Oracle中的字符串类型及相关函数详解

1.概述 本文介绍String类型及相关的函数,基于当前最新的Oracle 12c 为基础作介绍. 下文将字符串简称为串. Oracle函数的工作方式有两种: 1.根据旧的对象创建新的对象--他们对原来的信息进行修改,如改变字母的大小写. 2.告诉用户有关的信息,如一个单词或句子中有几个字符. 后续会更新另外两种处理文本的方式:Oracle中的正则表达式 和 Oracle Text工具,等文章编辑完成,会在此处添加链接. Oracle中主要有两种字符串类型:CHAR和VARCHAR2,他们以字母

Java中的==和equals的区别详解

1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先看内存中有没有存放值为"hello"的地址,如果有则将x指向这块内存地址:如果没有则在内存中重新开辟一块地址存放值"hello",并将x指向这块内存地址. String x = "hello"; String y = "hello"

深入Oracle的left join中on和where的区别详解

今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期                  交易次数   交易金额 2009-4-01           1              10 2009-4-02           2              20 2009-4-03           0              0 2009-4-04          5                50 一开始我用的左连接,用on做为两表关联条件,用wher

javascript中attribute和property的区别详解

DOM元素的attribute和property很容易混倄在一起,分不清楚,两者是不同的东西,但是两者又联系紧密.很多新手朋友,也包括以前的我,经常会搞不清楚. attribute翻译成中文术语为"特性",property翻译成中文术语为"属性",从中文的字面意思来看,确实是有点区别了,先来说说attribute. attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,attributes是一个类数

javascript中局部变量和全局变量的区别详解

javascript有两种变量:局部变量和全局变量.当然,我们这篇文章是帮助大家真正的区别这两种变量. 首先,局部变量是指只能在本变量声明的函数内部调用.全局变量时整个代码中都可以调用的变量.当然,单单从字面上理解肯定是不清楚的,下面我详细的介绍下: 大家都知道,变量是需要用var关键字声明的.但是javascript中也可以隐式的使用变量,就是不用声明,直接使用.而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的. 例如: 代码如下: function myName(

C#中struct与class的区别详解

转自:http://blog.csdn.net/justlovepro/archive/2007/11/02/1863734.aspx 有这么几点不同: 1.struct 是值类型,class是对象类型 2.struct 不能被继承,class可以被继承 3.struct 默认的访问权限是public,而class默认的访问权限是private. 4.struct不能由程序员申明构造函数,即使是默认(不带参数)的构造函数,同样也不能有析构的处理部分.这是因为Struct的构造函数是由编译器自动生