<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fcglx的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/fcglx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fcglx]]></copyright><item><title><![CDATA[关于C、C  、Java、Python语言类型的分类]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/102718787</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/102718787</guid><author>fcglx</author><pubDate>Thu, 24 Oct 2019 11:04:08 +0800</pubDate><description><![CDATA[C和C++是编译型语言，编译器将源文件编译成目标机器码，机器可直接运行，下次运行无需编译。但是如果要换一个平台执行，则必须重新编译。

  Java可以说是半编译型半解释型语言，Java源文件.java文件首先编译成.class（字节码），然后在解释器（JVM）中取出一行解释一行的方式来执行，也正是这个原因，不同平台有不同的JVM，使得Java实现了夸平台。

  Python算是...]]></description><category></category></item><item><title><![CDATA[设计模式------抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/90513941</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/90513941</guid><author>fcglx</author><pubDate>Fri, 24 May 2019 16:51:10 +0800</pubDate><description><![CDATA[抽象工厂模式：提供一个创建一系列相关或相互依赖对象的接口，而无需指定他们具体的类。

首先回顾工厂方法模式，定义一个用于创建对象的接口，让子类决定去实例化哪个类。下面通过一个改进程序来引出工厂方法模式的思考方式。

首先看一个没有涉及模式的例子：


/*
 * 
 * 无任何涉及模式，在一个数据库中添加数据和查询
 * 
 */
class user
{
	String _name;
	int ...]]></description><category></category></item><item><title><![CDATA[设计模式------建造者模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/90041969</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/90041969</guid><author>fcglx</author><pubDate>Thu, 09 May 2019 17:05:53 +0800</pubDate><description><![CDATA[建造者模式又叫生成器模式：将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。建造者模式将一个复杂的对象的构建与他的表示分离，使得同样的构建过程可以创建不同的表示。如果用了建造者模式，那么用户只需指定需要建造的类型就可以得到它们，而具体建造的过程和细节就不需知道。



在上图中Builder是控制大致流程的抽象类或接口。ConcreteBuilder是集成Builder后重...]]></description><category></category></item><item><title><![CDATA[设计模式----迪米特法则]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/90036665</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/90036665</guid><author>fcglx</author><pubDate>Thu, 09 May 2019 15:29:28 +0800</pubDate><description><![CDATA[迪米特法则也叫最少知识原则，如果两个类不必彼此直接通信，那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话，可以通过第三者转发这个调用。

在类的结构设计上，每一个类都应当尽量降低成员之间的访问权限，这一点和类的封装特性不谋而合。所以迪米特法则的根本思想强调了类之间的松耦合，类之间的耦合越弱，越有利于复用，一个处在弱耦合的类被修改，不会对有关系的类造成波及。
...]]></description><category></category></item><item><title><![CDATA[设计模式------外观模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/90026557</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/90026557</guid><author>fcglx</author><pubDate>Thu, 09 May 2019 11:52:38 +0800</pubDate><description><![CDATA[外观模式：为子系统中的一组接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。外观模式应用场景有三：1. 在设计初期阶段，应该有意识的将不同的层分开，比如经典三层架构数据访问层、业务逻辑层、表示层。2. 在开发阶段，子系统不断重构越来越复杂，很多类最好提供一个fade进行接口封装，减少他们之间的依赖。3. 维护大型系统时，提供fade管理陈旧代码，新开发的代码只与...]]></description><category></category></item><item><title><![CDATA[设计模式------模板方法模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/90025372</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/90025372</guid><author>fcglx</author><pubDate>Thu, 09 May 2019 11:45:33 +0800</pubDate><description><![CDATA[模板方法模式：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式是通过把不变行为搬移到超类，去除子类中重复代码，以体现它的优势。模板方法模式提供了一个很好的代码复用平台。所以，当不变和可变的行为在方法的子类实现中混合在一起的时候，不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方...]]></description><category></category></item><item><title><![CDATA[设计模式----原型模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89948045</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89948045</guid><author>fcglx</author><pubDate>Wed, 08 May 2019 11:13:38 +0800</pubDate><description><![CDATA[原型模式：用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。原型模式就是从一个对象再创建另一个可定制对象，而且不需知道任何创建的细节。省去了new对象时调用构造函数等的开销，只需一个clone函数即可搞定对象创建。



创建对象时因为是新建对象所以和C++一样存在浅拷贝和深拷贝的问题。举例来讲，像MemberwiseClone()方法，如果字段是值类型的，则对该字段执行逐位复制，如...]]></description><category></category></item><item><title><![CDATA[设计模式------代理模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89684653</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89684653</guid><author>fcglx</author><pubDate>Mon, 29 Apr 2019 23:45:42 +0800</pubDate><description><![CDATA[代理模式：为其他对象提供一种代理以控制对这个对象的访问。代理一般分为几种：远程代理、虚拟代理、安全代理等。

远程代理：为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

虚拟代理：是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化，比如说打开一个很大的html网页，里面有很多图片和文字，但还是可以很快的打开它，...]]></description><category></category></item><item><title><![CDATA[设计模式----装饰模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89674732</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89674732</guid><author>fcglx</author><pubDate>Mon, 29 Apr 2019 15:53:53 +0800</pubDate><description><![CDATA[装饰模式：动态地给一个对象添加一些额外的职责，就增加功能来说，装饰模式比生成子类更加灵活。下面举两个例子实现相同的一个人穿衣的功能流程，比较有无装饰模式的区别，装饰模式把所需的功能按正确的顺序串联起来进行控制，感觉封装的更好。

装饰模式结构图：



Component是定义一个对象接口，可以给这些对象动态的添加职责。ConcreteComponent是定义了一个具体的对象，也可以给这个对象添加...]]></description><category></category></item><item><title><![CDATA[设计模式------依赖倒转原则和里式替换原则]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89665522</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89665522</guid><author>fcglx</author><pubDate>Mon, 29 Apr 2019 01:03:04 +0800</pubDate><description><![CDATA[依赖倒转原则原话解释抽象不应该依赖细节，细节应该依赖对象，也就是要针对接口编程，不要对实现编程。官方定义两方面：A.高层模块不应该依赖底层模块，两个都应该依赖抽象；B.抽象不应该依赖细节，细节应该依赖抽象。

对于抽象，所谓依赖了抽象的接口或抽象类就不怕更改，还需要介入介绍里式替换原则。

里式替换原则：一个软件实体如果使用的是一个父类的话，那么一定适用于其子类，而且他察觉不出父类对象和子类对象的...]]></description><category></category></item><item><title><![CDATA[设计模式------工厂方法模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89648359</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89648359</guid><author>fcglx</author><pubDate>Sun, 28 Apr 2019 23:42:34 +0800</pubDate><description><![CDATA[工厂方法模式主要与简单工厂模式相比较，通过前面的文章“计算器简单工厂模式”可知，简单工厂模式的最大优点就是工厂类中包含了必要的逻辑判断，根据客户端的选择条件动态实例化相关的类，对于客户端来说，去除了与具体产品的依赖。设想：如果新加一个运算比如开放，我们一方面要加开方类（这是扩展），另一方面我们要在工厂类中加case条件（这是修改），所以违背了开—闭原则。

工厂方法模式定义一个用于创建对象的接口，...]]></description><category></category></item><item><title><![CDATA[设计模式------单一职责原则和开—闭原则]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89528603</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89528603</guid><author>fcglx</author><pubDate>Fri, 26 Apr 2019 00:06:43 +0800</pubDate><description><![CDATA[单一职责原则：就一个类而言，应该仅有一个引起它变化的原因。如果一个类承担的职责过多，就等于把这些职责耦合在一起，一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计，当变化发生时，设计会遭受到意向不到的破坏。比如说俄罗斯方块游戏，考虑哪些是界面，哪些是逻辑，然后封装成不同的类。

软件设计真正要做的许多内容就是发现职责并把那些职责相互分离，如何判断是否应该分离出类来，就...]]></description><category></category></item><item><title><![CDATA[设计模式------策略模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89462303</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89462303</guid><author>fcglx</author><pubDate>Tue, 23 Apr 2019 23:28:29 +0800</pubDate><description><![CDATA[策略模式：他定义了算法家族，分别封装起来，让他们之间可以互相替换，此模式让算法的变化不会影响使用算法的客户。



父类Strategy定义所有算法的公共接口，比如说不管打折、原价、或者满减模式，都会得到一个价格的接口getResult()

伪代码示例：


// 抽象算法父类
abstract class father
{
    // 算法方法
    public void fun();
...]]></description><category></category></item><item><title><![CDATA[设计模式-----计算器简单工厂模式]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/89414040</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/89414040</guid><author>fcglx</author><pubDate>Sat, 20 Apr 2019 22:56:44 +0800</pubDate><description><![CDATA[简单工厂模式就是使用父类指针指向实例化对象，思考到底使用多态要实例化谁，将来增加一个单独的类来创造实例，但是在外观实现上还是使用之前的父类指针。

下面以一个面向对象思想的计算器程序来实现简单工厂模式。


class interator
{
	protected double ValueA;
	protected double ValueB;
	public void setA(double s...]]></description><category></category></item><item><title><![CDATA[嵌入式linux------编写C语言程序点亮led灯]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88959220</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88959220</guid><author>fcglx</author><pubDate>Mon, 01 Apr 2019 22:38:35 +0800</pubDate><description><![CDATA[使用c语言替代汇编的原理也是往寄存器地址写数值，访问寄存器地址和访问内存是一样的。给出C语言程序：


int main()
{
	unsigned int *pGPFDAT = (unsigned int*)0x56000050;
	unsigned int *pGPFCON = (unsigned int*)0x56000054;

	*pGPFDAT = 0x400;
	*pGPFCON =...]]></description><category></category></item><item><title><![CDATA[嵌入式linux------大小字节序和位操作]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88773921</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88773921</guid><author>fcglx</author><pubDate>Sun, 24 Mar 2019 10:20:52 +0800</pubDate><description><![CDATA[字节序：ARM芯片存储数据的方式，多数默认使用小字节序。低位存放在低地址是小字节序，高位存放在低地址是大字节序。2440默认使用小字节序，但是可以通过设置某个寄存器去设置系统使用大或小字节序。使用C语言程序判断大小字节序程序如下：


void judge（）
{
    union stru{
    int a;
    char b;
    }
    
    stru.a = 1;
 ...]]></description><category></category></item><item><title><![CDATA[嵌入式linux------汇编码和机器码]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88757393</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88757393</guid><author>fcglx</author><pubDate>Sat, 23 Mar 2019 22:33:41 +0800</pubDate><description><![CDATA[使用点亮LED的简单程序分析其汇编码和机器码，通过直接修改bin文件中的机器码修改功能，点亮其他的LED灯。

首先修改Makefile文件把elf文件反汇编生成dis文件，查看其真正的汇编指令：


all:
	arm-linux-gcc -c -o Led_on.o Led_on.S
	arm-linux-ld -Ttext 0 Led_on.o -o Led_on.elf
	arm-linu...]]></description><category></category></item><item><title><![CDATA[嵌入式linux------第一个嵌入式程序，点亮LED灯]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88676216</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88676216</guid><author>fcglx</author><pubDate>Tue, 19 Mar 2019 23:17:54 +0800</pubDate><description><![CDATA[开发嵌入式程序一般需要三个步骤：1.看原理图，确定引脚，在此程序中就是找到控制LED的引脚。2. 查阅主芯片手册，确定如何设置控制引脚。3. 写程序。

查看手册过程：

在芯片手册中搜索led找到对应gpio引脚n_LED1，（在芯片引脚连接中，同名网络（net）表示连接在一起），n表示低电平有效，低电平时灯亮。n_LED1连接GPF4，对于引脚的设置一般分为两步首先设置为输出或者输入引脚，其次...]]></description><category></category></item><item><title><![CDATA[真机部署Openstack环境踩坑记录]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88542219</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88542219</guid><author>fcglx</author><pubDate>Wed, 13 Mar 2019 21:59:35 +0800</pubDate><description><![CDATA[最近项目上需要部署openstack云测试环境，遂在戴尔R730和联想ThinkServer350上部署环境。

1. 制作CentOS7.3系统的U盘安装盘并安装，注意安装带有桌面系统的版本，安装过程中有两个问题，其一是在安装开始界面设置U盘的引导，U盘的分区比较靠后，可以使用ls /dev | grep sd来过滤，一般在最后面，比如/dev/sdb4或者/dev/sdc4；其二是在安装过程中...]]></description><category></category></item><item><title><![CDATA[嵌入式linux------MMU内存映射和访问权限检查]]></title><link>https://blog.youkuaiyun.com/fcglx/article/details/88353688</link><guid>https://blog.youkuaiyun.com/fcglx/article/details/88353688</guid><author>fcglx</author><pubDate>Mon, 11 Mar 2019 11:58:33 +0800</pubDate><description><![CDATA[在JZ2440中有64MB的内存，假设在内存SDRAM中有n个APP在同时运行，他们的地址各不相同。程序在运行时所处的地址是链接地址，所以在编译某个APP时需要单独指定其链接地址，但是这是不可能的，因为有可能在同一时间有成百上千个APP在同时运行，APP太多不可能全部重新编译，也不可能预测它的地址。

为了解决这个问题，必须引入虚拟地址，即虽然这些APP保存在内存中的地址各不一样，但是当CPU运行...]]></description><category></category></item></channel></rss>