JS中的怪胎继承方法

没有评论

2012 年 12 月 31 日 at 上午 11:03分类:JavaScript

最近做个东西需要用到JS的继承,之前不是很了解,今天看了资料 整理下 ,方便自己查阅。
js继承有几种实现方式:
1、call()方法方式

call方法是Function类中的方法
call方法的第一个参数的值赋值给类(即方法)中出现的this
call方法的第二个参数开始依次赋值给类(即方法)所接受的参数

function test(str){ 
    alert(this.name + " " + str); 
} 
var object = new Object(); 
object.name = "zhangsan"; 
test.call(object,"langsin");//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str 

function Parent(username){ 
    this.username = username; 
    this.hello = function(){ 
      alert(this.username); 
    } 
} 
function Child(username,password){ 
    Parent.call(this,username); 
    
    this.password = password; 
    this.world = function(){ 
      alert(this.password); 
    } 
} 
var parent = new Parent("zhangsan"); 
var child = new Child("lisi","123456"); 
parent.hello(); 
child.hello(); 
child.world(); 

2、apply()方法方式
apply方法接受2个参数,
A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this
B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数

function Parent(username){ 
    this.username = username; 
    this.hello = function(){ 
      alert(this.username); 
    } 
} 
function Child(username,password){ 
    Parent.apply(this,new Array(username)); 
    this.password = password; 
    this.world = function(){ 
      alert(this.password); 
    } 
} 
var parent = new Parent("zhangsan"); 
var child = new Child("lisi","123456"); 
parent.hello(); 
child.hello(); 
child.world();

3、原型链方式,即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承

  
function Person(){ 
} 
Person.prototype.hello = "hello"; 
Person.prototype.sayHello = function(){ 
    alert(this.hello); 
} 
  
function Child(){ 
 } 
Child.prototype = new Person();//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承 
Child.prototype.world = "world"; 
Child.prototype.sayWorld = function(){ 
    alert(this.world); 
} 
  
var c = new Child(); 
c.sayHello(); 
c.sayWorld(); 

4、混合方式,混合了call方式、原型链方式

function Parent(hello){ 
    this.hello = hello; 
} 
Parent.prototype.sayHello = function(){ 
    alert(this.hello); 
} 

function Child(hello,world){ 
    Parent.call(this,hello);//将父类的属性继承过来 
    this.world = world;//新增一些属性 
} 

Child.prototype = new Parent();//将父类的方法继承过来 

Child.prototype.sayWorld = function(){//新增一些方法 
    alert(this.world); 
} 

var c = new Child("zhangsan","lisi"); 
c.sayHello(); 
c.sayWorld();

PHP 备忘录模式

没有评论

2012 年 12 月 28 日 at 下午 4:39分类:PHP

<?php
/**
 * 创建一个起始角色
 */
class Originator
{
	private $_state = null;
	
	public function __construct(){
		$this->_state = 10;
	}
	
	public function getState(){
		
		return $this->_state;
		
	}
	
	public function setState( $state ){
		
		$this->_state = $state;
		
	}
	
	/**
	 * 创建一个备忘录存储
	 */
	public function createMemento(){
		return new Memento($this->_state);
	}
	
	/**
	 * 恢复备忘录中的数据
	 */
	public function resetStateFromMemento($memento){
		$this->_state = $memento->getState();
	}
	
}

/**
 * 备忘录class
 */
class Memento
{
    private $_state = null;
    
    public function __construct($state){
        $this->_state = $state;
    }
    
    public function getState(){
        return $this->_state;
    }
    
    public function setState($state){
        $this->_state = $state;
    }

}

/**
 * 临时管理者class
 */
class Caretaker
{
	private $memento = null;
	
	public function saveMemento($memento){
		$this->memento = $memento;
	}
	
	public function getMemento(){
		return $this->memento;
	}
	
}

$originator = new Originator();
$caretaker = new Caretaker();

//保存数据到备忘录
$caretaker->saveMemento($originator->createMemento());
 
echo $originator->getState();

//修改起始角色值
$originator->setState(10000);

echo $originator->getState();

//从备忘录中恢复数据
$originator->resetStateFromMemento($caretaker->getMemento());

echo $originator->getState();

暂时还没有想到有什么场景需要用到这种设计。感觉可能像一些操作的撤销功能等。但是换句话说,一个撤销功能没必要搞的这么复杂吧。期待高手。。。。

PHP 访问者模式

没有评论

2012 年 12 月 28 日 at 下午 2:06分类:PHP

例子场景:顾客在超市中将选择的商品,如苹果和图书等放在购物车中,探后到收银员出付。
在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时
也需要访问购物车内顾客所选的商品。此时购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品,而顾客和收银员作为访问
这些的访问者,他们需要对商品进行检查和计价。不同类型的商品其访问的形式也可能不同,
如苹果需要过秤之后再计价,而图书不需要。使用访问者模式来设计该购物过程。

<?php
/**
*
* 访问者 
*/
interface Visitor
{
	public function visitApple(Product $apple);
	public function visitBook(Product $book);
}
 
class Customer implements Visitor
{
 	public function visitApple(Product $apple){
 		echo "这里是顾客查看苹果信息的方法<br />";
 	}

 	public function visitBook(Product $book){
 		echo "这里是顾客查看书籍信息的方法<br />";
 	}
}
 
class Saler implements Visitor
{
 	public function visitApple(Product $apple){
 		echo "这里是售货员查看苹果信息的方法<br />";
 	}

 	public function visitBook(Product $book){
 		echo "这里是售货员查看书籍信息的方法<br />";
 	}
}

/**
*
* 被访问者 
*/
interface Product
{
	public function accept($visitor); 
}
 
class Apple implements Product
{
 	public function accept($visitor)
     {
 		$visitor->visitApple($this);
     }
}
 
class Book implements Product
{
 	public function accept($visitor)
     {
 		$visitor->visitBook($this);
     }
}

/**
*
* 对象结构
*/
class ObjectStructure
{
 	private $_products = array();
 
 	public function addProduct(Product $product)
     {
 		$this->_products[] = $product;
     }
 
	public function detach($product)
     {
 		if($key=array_search($product, $this->_products) !==false){
 			unset($this->_products[$key]);
 		} 
     }
 
 	public function accept($visitor)
     {
  		foreach($this->_products as $product)
         {
 			$product->accept($visitor);
         }
     }
}
 
 $objOS = new ObjectStructure();

 //添加被访问者(商品)
 $objOS->addProduct(new Book());
 $objOS->addProduct(new Apple());
 
 //接收访问者
 $objOS->accept(new Customer());
 $objOS->accept(new Saler());
 

PHP 命令模式

没有评论

2012 年 12 月 28 日 at 上午 11:33分类:PHP

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

<?php  
/**  
 * The Command abstraction.  
 * In this case the implementation must return a result,  
 * sometimes it only has side effects.  
 */ 
interface Validator  
{  
    /**  
     * The method could have any parameters.  
     * @param mixed  
     * @return boolean  
     */ 
    public function isValid($value);  
}  
 
/**  
 * ConcreteCommand.  
 */ 
class MoreThanZeroValidator implements Validator  
{  
    public function isValid($value)  
    {  
        return $value > 0;  
    }  
}  
 
/**  
 * ConcreteCommand.  
 */ 
class EvenValidator implements Validator  
{  
    public function isValid($value)  
    {  
        return $value % 2 == 0;  
    }  
}  
 
/**  
 * The Invoker. An implementation could store more than one  
 * Validator if needed.  
 */ 
class Processor  
{  
    protected $_rule;  
 
    public function __construct (Validator $rule)  
    {  
        $this->_rule = $rule;  
    }  
 
    public function process(array $numbers)  
    {  
        foreach ($numbers as $n) {  
            if ($this->_rule->IsValid($n)) {  
                echo $n, "\n";  
            }  
        }  
    }  
}  
// Client code  
$validObject = new EvenValidator();
$processor = new Processor($validObject );  
$processor->process(array(1, 20, 18, 5, 0, 31, 42)); 

方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;
一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;
ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;
复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

php 策略模式

没有评论

2012 年 12 月 27 日 at 下午 6:01分类:PHP

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以 在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

<?php
/**
 * 数据源保存方式接口
 * 定义了数据源操作的四种基本方式 (增,删,改,查)
 */
interface data_source {
	public function add();
	public function delete();
	public function update();
	public function find();
}
/**
 * 数据库保存方式具体类
 * 具体的数据源接口的一种形式,该形式是把数据保存到数据库
 */
class db_source implements data_source {
	public function add() {
		// 在这里写把数据插入数据库的代码
		echo "增加数据到数据库";
	}
	public function delete() {
		// 在这里写把数据从数据库删除的代码
		echo "删除数据";
	}
	public function update() {
		// 在这里写修改数据库中的数据的代码
		echo "修改数据";
	}
	public function find() {
		// 在这里从数据库查找数据代码
		echo "查找数据";
	}
}
/**
 * 文件保存方式具体类
 * 具体的数据源接口的另一种形式,该形式是把数据保存到文件
 */
class file_source implements data_source {
	public function add() {
		// 在这里写把数据插入文件的代码
		echo "增加数据到文件";
	}
	public function delete() {
		// 在这里写把数据从文件删除的代码
		echo "删除数据";
	}
	public function update() {
		// 在这里写修改文件中的数据的代码
		echo "修改数据";
	}
	public function find() {
		// 在这里从文件查找数据代码
		echo "查找数据";
	}
}
/*  
   	mongodb保存方式具体类
  	该形式是把数据保存到mongodb
*/
 class mongodb_source implements data_source {
	public function add() {
		// 在这里写把数据插入文件的代码
		echo "增加数据到mongodb";
	}
	public function delete() {
		// 在这里写把数据从文件删除的代码
		echo "删除数据";
	}
	public function update() {
		// 在这里写修改文件中的数据的代码
		echo "修改数据";
	}
	public function find() {
		// 在这里从文件查找数据代码
		echo "查找数据";
	}
}
 
/**
 * 策略类
 * 该类根据要求返回符合要求类别的的数据源
 * 本例 $strategyName = db_source 或者 $strategyName = file_source
 */
class Strategy {
	// 当然项目的实际应用情况可能比较复杂经过一系列的逻辑处理才能返回符合要求的实例,
	// 这里只是演示,所以体现了最简单的情况
 	public function getInstance($strategyName) {
 		return new $strategyName;
 	}
}
/**
 * 主体事件处理类 
 */
class control {
	private $datasource;
	public function __construct($strategyName) {
		// 策略者根据 要求($strategyName)经过内部决策生成一种实例
		$this->datasource = Strategy::getInstance($strategyName);
	}
	// 逻辑处理
	public function add() {
		$this->datasource->add();
	}
} 
// 测试代码 
//1:
$control = new control("db_source");
$control->add();
// return 增加数据到数据库
//2:
$control = new control("file_source");
$control->add();
// return 增加数据到文件
//3:
 $control = new control("mongodb_source");
 $control->add();

?>

其实这个,让我想起了工厂模式的写法。感觉很相似,其实设计模式是不好单独拿出来讲的。策略的选择是该模式的一部分,当然可以用工厂。关键是一种可以随意增加算法工具,而不用修改主体类的思想,当然不必拘泥于代码的形式.

PHP安装fastDFS扩展

没有评论

2012 年 12 月 12 日 at 下午 9:20分类:Linux | PHP

1、下载FastDFS源程序,最好与FastDFS服务器版本匹配,这里我下载了FastDFS_v4.03.tar.gz版本,放在/usr/local/src目录下。
2、服务器的LNMP环境以及OK了,PHP安装目录为/usr/local/php
3、步骤

# tar zxvf FastDFS_v4.03.tar.gz
# cd FastDFS
# ./make.sh
# ./make.sh install
# cd client
# make
# make install
# cd ../php_client

如以上不安装,直接进php_client目录进行编译安装,会报如下错误:
make: *** [fastdfs_client.lo] Error 1

# /usr/local/php/bin/phpize //执行php的安装目录下的phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make
# make install
# cp ../conf/client.conf /etc/fdfs/
# cd /etc/fdfs/
# vi client.conf,保存
tracker_server=192.168.1.136:22122 //根据环境填写IP地址及端口号

在php.ini配置文件中加载fastdfs

# cat fastdfs_client.ini >> /usr/local/php/etc/php.ini

4、重启web服务器即可。在php_client已经有扩展函数说明和程序示例
5、验证扩展
执行命令:

# php -m | grep fastdfs

看下有木有。

生成二维码

没有评论

2012 年 12 月 12 日 at 下午 4:48分类:WEB开发

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title> 
</head>  
<body>
    <div id="showEWM"></div> 
    <script type="text/javascript"> 
    document.getElementById("showEWM").innerHTML = "<img src='http://chart.apis.google.com/chart?cht=qr&&chs=550x500&chl="+window.location.href+"'/>" 
    </script>      
</body>  
</html> 
$todoString="www.maomii.com"; 
generateQRfromGoogle($todoString);

/**
 * google api 最多4296个字符
 * @param string $str 二维码包含的信息,数据须经过UTF-8 URL-encoded.如果需要传递的信息超过2K个字节,请使用POST方式
 * @param int $widhtHeight 生成二维码的尺寸设置
 * @param string $EC_level 可选纠错级别,QR码支持四个等级纠错,用来恢复丢失的、读错的、模糊的、数据。
 *                         L-默认:可以识别已损失的7%的数据
 *                         M-可以识别已损失15%的数据
 *                         Q-可以识别已损失25%的数据
 *                         H-可以识别已损失30%的数据
 * @param int $margin 生成的二维码离图片边框的距离
 */ 
function generateQRfromGoogle($str,$widhtHeight ='150',$EC_level='L',$margin='0') 
{ 
    $str = urlencode($str); 
    echo '<img src="http://chart.apis.google.com/chart?chs='.$widhtHeight.'x'.$widhtHeight.'&cht=qr&chld='.$EC_level.'|'.$margin.'&chl='.$str.'" alt="QR code" widhtHeight="'.$widhtHeight.'" widhtHeight="'.$widhtHeight.'"/>'; 
}

详细见谷歌的:http://www.haijd.net/archive/computer/google/google_chart_api/api.html

Linux中awk命令的一般使用

没有评论

2012 年 12 月 02 日 at 下午 3:35分类:Linux

awk是一个非常棒的数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。运行效率高,而且代码简单,对格式化的文本处理能力超强。
先来看一个例子:
文件test,统计文件test的第一列中是浮点数的行的浮点数的平均值,用awk来实现只需要一句话就可以搞定
test内容:

$ cat a
1.021 33
1#.ll 44
2.53 6
6.@98 43
ss    7

awk命令如下:

awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' test
#或者:
#awk 'BEGIN{total = 0;len = 0} $1~/^[0-9]+\.[0-9]*/ {total += $1; len++} END{print total/len}' test

分析:$1~/^[0-9]+\.[0-9]*/表示$1与“/ /”里面的正则表达式进行匹配,若匹配,则total加上$1,且len自增,即数目加1.“^[0-9]+\.[0-9]*”是个正则表达式,“^[0-9]”表示以数字开头,“\.”是转义的意思,表示“.”为小数点的意思。“[0-9]*”表示0个或多个数字

awk的一般语法格式为:
  awk [-参数 变量] ‘BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}’
其中:BEGIN和END中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和析构。

(1)参数说明:
-F re:允许awk更改其字段分隔符
-v var=$v 把v值赋值给var,如果有多个变量要赋值,那么就写多个-v,每个变量赋值对应一个-v
    e.g. 要打印文件test的第num行到num+num1行之间的行,
      awk -v num=$num -v num1=$num1 ‘NR==num,NR==num+num1{print}’ test
-f progfile:允许awk调用并执行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。

(2)awk内置变量:
ARGC: 命令行参数的个数

      awk '{print ARGC}' /etc/passwd
     

ARGV: 命令行参数数组

      awk '{print ARGV[1], ARGV[0], ARGV[1]}' /etc/passwd
     

ARGIND: 当前被处理文件的ARGV标志符

     awk '{if(ARGIND==1){print "处理test1文件"} if(ARGIND==2){print "处理test2文件"}}' test1 test2
     

文件处理的顺序是先扫描完test1文件,再扫描test2文件
NR:   已经读出的记录数
FNR: 当前文件的记录数上面的例子也可以写成这样:

     awk 'NR==FNR{print "处理文件test1"} NR > FNR{print "处理文件test2"}' test1 test2
     

输入文件test1和test2,由于先扫描test1,所以扫描test1的时候必然有NR==FNR,然后扫描b的时候,FNR从1开始计数,而NR则接着test1的行数继续计数,所以NR > FNR
e.g 要显示文件的第10行至第15行

      awk 'NR==10,NR==15{print}' kk.sh
     

FS: 输入字段分隔符(缺省为:space:),相当于-F选项

      awk -F ':' '{print}' test1    和   awk 'BEGIN{FS=":"}{print}' test1 是一样的
     

OFS: 输出字段分隔符(缺省为:space:)

     awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' test2
     

如果cat test2为
1:2:3:4:5:6
那么把OFS设置成”;”后就会输出
1;2;3;4;5;6
(小注释:awk把分割后的第1、2、3个字段用$1,$2,$3…表示,$0表示整个记录(一般就是一整行))
NF: 当前记录中的字段个数

    awk -F ':' '{print NF}' test1的输出为
    3
    3
    

表明test1的每一行用分隔符”:”分割后都3个字段
可以用NF来控制输出符合要求的字段数的行,这样可以处理掉一些异常的行

    awk -F ':' '{if (NF == 3)print}' test1

RS: 输入记录分隔符,缺省为”\n”
缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录
例如,如果文件test3,cat test3为

   hello world; I want to go swimming tomorrow;hiahia

运行

awk 'BEGIN{ RS = ";" } {print}' test3 

的结果为

    hello world
    I want to go swimming tomorrow
    hiahia

合理的使用RS和FS可以使得awk处理更多模式的文档,例如可以一次处理多行,例如文档test4, cat test4的输出为

    1 2
    3 4 5
    
    6 7
    8 9 10
    11 12

    hello

每个记录使用空行分割,每个字段使用换行符分割,这样的awk也很好写

    awk 'BEGIN{ FS = "\n"; RS = ""} {print NF}' test4 输出
    2
    3
    1

ORS:输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号

awk 'BEGIN{ FS = "\n"; RS = ""; ORS = ";"} {print NF}' test4 输出[code]
   2;3;1

(3)awk读取shell中的变量
可以使用-v选项实现功能
$b=1
$cat test5
apple

$ awk -v var=$b '{print var, $var}' test5
1 apple

其实上面的$var已经被解析成了$1了,于是出来的结果是apple.
至于有没有办法把awk中的变量传给shell呢,这个问题我是这样理解的。shell调用awk实际上是fork一个子进程出来,而子进程是无法向父进程传递变量的,除非用重定向(包括管道)

$ a=$(awk '{print $b, '$b'}' test5)
$ echo $a
apple 1

(4)输出重定向
awk的输出重定向类似于shell的重定向。重定向的目标文件名必须用双引号引用起来。

$awk '$4 >=70 {print $1,$2 > "destfile" }' filename
$awk '$4 >=70 {print $1,$2 >> "destfile" }' filename

(5)awk中调用shell命令:

awk中的管道概念和shell的管道类似,都是使用"|"符号。如果在awk程序中打开了管道,必须先关闭该管道才能打开另一个管道。也就是说一次只能打开一个管道。shell命令必须被双引号引用起来。“如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。注意,管道一旦被打开,就会保持打开状态直至awk退出。因此END块中的语句也会收到管道的影响。(可以在END的第一行关闭管道)”
awk中使用管道有两种语法,分别是:

awk output | shell input
shell output | awk input

对于awk output | shell input来说,shell接收awk的输出,并进行处理。需要注意的是,awk的output是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管道关闭时(需要显式的关闭管道)”

$awk '/west/{count++} {printf "%s %s\t\t%-15s\n", $3,$4,$1 | "sort +1"} END{close "sort +1"; printf "The number of sales pers in the western"; printf "region is " count "." }' datafile 

解释:/west/{count++}表示与“wes”t进行匹配,若匹配,则count自增
printf函数用于将输出格式化并发送给管道。所有输出集齐后,被一同发送给sort命令。必须用与打开时完全相同的命令来关闭管道(sort +1),否则END块中的语句将与前面的输出一起被排序。此处的sort命令只执行一次。

在shell output | awk input中awk的input只能是getline函数。shell执行的结果缓存于pipe中,再传送给awk处理,如果有多行数据,awk的getline命令可能调用多次。

$ awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' test5

vmware中centos的ip配置

没有评论

2012 年 12 月 01 日 at 下午 9:45分类:Linux

在老版本的虚拟机(vmware)中,安装了centos后,默认是没有IP地址的,需要手动设置IP地址,才可以上网。新版本(8.0)中只要装了系统,网络连接采用NAT方式,不用任何设置,即可上网。下面介绍老版中的IP设置。
网络连接方式还是采用NAT方式,设置eth0的ip地址

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
#设置静态IP地址
BOOTPROTO=static
#系统启动后自动启动eth0网卡
ONBOOT=yes
# 设置静态IP地址
# 这个IP地址根据 编辑>虚拟网络设置>NAT>默认网关(GATEWAY) 设置
# 本次虚拟机的默认网关是192.168.1.2(或者命令arp -a查看)
# 只要将最后一位不要设置成2
IPADDR=192.168.1.110
# 设置子网掩码
# 这个基于 编辑>虚拟网络设置>NAT>子网掩码(Netmask) 设置
NETMASK=255.255.255.0
# 设置默认网关
# 这个就是 编辑>虚拟网络设置>NAT>默认网关(GATEWAY)
GATEWAY=192.168.1.2

这个网关的配置项也可以写到/etc/sysconfug/network文件中,但是/etc/sysconfug/network-scripts/ifcfg-eth0的优先权高;

设置DNS(域名解析)

# vi /etc/resolv.conf
# 设置域名 就是上面提到的默认网关
nameserver 192.168.1.2

重启网络

#service network restart