목차
七. PHP模式设计----执行及描述任务
php教程 php手册 七. PHP模式设计----执行及描述任务

七. PHP模式设计----执行及描述任务

Jun 13, 2016 am 09:20 AM
모델

七. PHP模式设计----执行及描述任务

1. 解析器模式


//解析器内容类
//用于存放表达式的运算结果,并且能根据传入的表达式返回当初记录的结果
class InterpreterContext{
    private $expressionstore=array();
    //将对象放进array里面,索引号是对象ID号
    function replace(Expression $exp,$value){
        $this->expressionstore[$exp->getKey()]=$value;
    }
    function lookup(Expression $exp){
        return $this->expressionstore[$exp->getKey()];
    }
}
abstract class Expression{
    private static $keyCount=0;
    private $key;
    abstract function interpret(InterpreterContext $context);
    //每一个对象都有一个唯一的key
    function getKey(){
        if(!isset($this->key)){
            $this->key=++self::$keyCount;
        }
        return $this->key;
    }
}
//字符串
class LiteralExpression extends Expression{
    private $value;
    function __construct($value){
        $this->value=$value;
    }
    function interpret(InterpreterContext $context){
        $context->replace($this, $this->value);
    }
}
//变量
class VariableExpression extends Expression{
    private $value;
    private $name;
    function __construct($name,$value=null){
        $this->name=$name;
        $this->value=$value;
    }
    function setValue($value){
        $this->value=$value;
    }
    function getKey(){
        return $this->name;
    }
    function interpret(InterpreterContext $context){
        if(!is_null($this->value)){
            $context->replace($this, $this->value);
            //设置为空,可以避免在没有修改value的情况下再次调用该方法的时候,
            //也第二次调用了InterpreterContext::replece
            $this->value=null;
        }
    }
}
//操作符表达式 抽象基类
abstract class OperatorExpression extends Expression{
    //左右操作数
    protected $l_op;
    protected $r_op;
    function __construct(Expression $l_op,Expression $r_op){
        $this->l_op=$l_op;
        $this->r_op=$r_op;
    }
    function interpret(InterpreterContext $context){
        $this->l_op->interpret($context);
        $this->r_op->interpret($context);
        $result_l=$context->lookup($this->l_op);
        $result_r=$context->lookup($this->r_op);
        $this->doInterpret($context, $result_l, $result_r);
    }
    protected abstract function doInterpret(InterpreterContext $context,$result_l,$result_r);
}
//相等表达式
class EqualsExpression extends OperatorExpression{
    //计算后将结果保存进this里...
    protected function doInterpret(InterpreterContext $context,$result_l,$result_r){
        $context->replace($this, $result_l==$result_r);
    }
}
//布尔或表达式
class BooleanOrExpression extends OperatorExpression{
    protected function doInterpret(InterpreterContext $context, $result_l, $result_r){
        $context->replace($this, $result_l || $result_r);
    }
}
//布尔与表达式
class BooleanAndExpression extends OperatorExpression{
    protected function doInterpret(InterpreterContext $context, $result_l, $result_r){
        $context->replace($this, $result_l && $result_r);
    }
}
/*
$context=new InterpreterContext();
$literal=new LiteralExpression("Bob");
$literal->interpret($context);
print $context->lookup($literal);//Bob
$context=new InterpreterContext();
$myvar=new VariableExpression("V","one");
$myvar->interpret($context);
print $context->lookup($myvar);//one
$myothervar=new VariableExpression("V");
$myvar->interpret($context);
print $context->lookup($myvar);//one
*/
//利用上面的代码来检测迷你型语言
//$input equals "4" or $input equals "four"
$context=new InterpreterContext();
//一个没有赋值的变量
$input=new VariableExpression('input');
//定义一个复杂的布尔型变量,初始化的参数被保存在l_op,r_op里面
//注意,此时他们还没有进行相关运算,必须等到调用布尔型变量的interpret()
//之后,布尔型变量里面的参数才会各自调用自身的interpret,形成一个调用栈...
$statement=new BooleanOrExpression(
        new EqualsExpression($input, new LiteralExpression('four')), 
        new EqualsExpression($input, new LiteralExpression('4')));
$statement->interpret($context);
print $context->lookup($statement);
foreach (array('four','4','52') as $val){
    $input->setValue($val);
    print "$val:\n";
    $statement->interpret($context);
    if($context->lookup($statement)){
        print "top marks\n";
    }else{
        print "dunce hat on\n\n";
    }
}
/*four:
top marks
4:
top marks
52:
dunce hat on*/  

2.策略模式
      将类中许多不同操作而且是来自同一个接口的算法,独立起来封装在一个新类中,主类在由分类组合或者聚合而成

//Question类将由Marker聚合而成
abstract class Question{
    protected $prompt;
    protected $marker;
    function __construct($prompt,Marker $marker){
        $this->marker=$marker;
        $this->prompt=$prompt;
    }
    //利用委托实现
    function mark($response){
        return $this->marker->mark($response);
    }
}
class TextQuestion extends Question{
    //处理文本问题特有的操作
}
class AVQuestion extends Question{
    //处理语音问题特有操作
}
//策略对象
//将算法部分独立出来封装在Marker类中....
abstract class Marker{
    protected $test;
    function __construct($test){
        $this->test=$test;
    }
    abstract function mark($response);
}
//MarkLogic语言
class MarkLogicMarker extends Marker{
    protected $engine;
    function __construct($test){
        parent::__construct($test);
    }
    function mark($response){
        //模拟返回true
        return true;
    }
}
//直接匹配
class MatchMarker extends Marker{
    function mark($response){
        return ($this->test==$response);
    }
}
//正则表达式
class RegexpMarker extends Marker{
    function mark($response){
        return (preg_match($this->test, $response));
    }
}
//客户端示例代码
$markers=array(new RegexpMarker("/f.ve/"),
        new MatchMarker("fivev"),
        new MarkLogicMarker('$input equals "five"'));
foreach($markers as $marker){
    print get_class($marker)."\n";
    //新建一个问题,将marker实例传进去
    $question=new TextQuestion("How many beans make five", $marker);
    foreach (array("five","four") as $response){
        print "\t response:$response: ";
        if($question->mark($response)){
            print "well done\n";
        }else{
            print "never mind\n";
        }
    }
}
/*RegexpMarker
     response:five: well done
     response:four: never mind
MatchMarker
     response:five: never mind
     response:four: never mind
MarkLogicMarker
     response:five: well done
     response:four: well done
*/

3 观察者模式

     观察者模式的和兴是把客户元素(观察者)从一个中心类中分离开来.当主体中有事件发生时,观察者必须被通知到!同时观察者和主体类不是通过硬编码实现,而是通过接口组合聚合实现
*问题
// Login类(主体类)
class Login {
    const LOGIN_USER_UNKNOWN = 1;
    const LOGIN_WRONG_PASS = 2;
    const LOGIN_ACCESS = 3;
    private $status = array ();
    // 登录操
    function handleLogin($user, $pass, $ip) {
        $ret=false;
        switch (rand ( 1, 3 )) {
            case 1 :
                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );
                $ret=ture;
                break;
            case 2 :
                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );
                $ret=false;
                break;
            case 3 :
                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );
                $ret=false;
                break;
            default:
                $ret=false;
        }
        //如果需要记录IP时
        Logger::logIP($user, $ip, $this->getStatus());
        //如果需要把登录失败的人的IP发送到管理员邮箱时...
        if(!$ret){
            Notifier::mailWarning($user, $ip, $this->getStatus());
        }
        //还需要其他功能时,比如特殊IP需要设置cookie等...
        //需要在这里面一直添加...
        return $ret;
    }
    function setStatus($status, $user, $ip) {
        $this->status = array ($status,$user,$ip);
    }
    function getStatus(){
        return $this->status;
    }
}
class Logger{
    static function logIP($user,$ip,$status){}
}
class Notifier{
    static function mailWarning($user,$ip,$status){}
}
*利用观察者模式,使代码改动少些....
// 主体类的抽象接口
interface Observable{
    //附加
    function attach(Observer $observer);
    //删除
    function detach(Observer $observer);
    //通知
    function notify();
}
// Login类(主体类)
class Login implements Observable{
    const LOGIN_USER_UNKNOWN = 1;
    const LOGIN_WRONG_PASS = 2;
    const LOGIN_ACCESS = 3;
    private $observers;
    private $status = array ();
    // 登录操作
    function handleLogin($user, $pass, $ip) {
        $ret=false;
        switch (rand ( 1, 3 )) {
            case 1 :
                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );
                $ret=ture;
                break;
            case 2 :
                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );
                $ret=false;
                break;
            case 3 :
                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );
                $ret=false;
                break;
            default:
                $ret=false;
        }
        //使用观察者模式之后,如果需要增加新功能,只需要在本类中添加观察者实例即可...
        $this->notify();
        return $ret;
    }
    function setStatus($status, $user, $ip) {
        $this->status = array ($status,$user,$ip);
    }
    function getStatus(){
        return $this->status;
    }
    function attach(Observer $observer){
        $this->observers[]=$observer;
    }
    function detach(Observer $observer){
        $newObserver=array();
        foreach ($this->observers as $obs){
            if($obs!==$observer){
                $newObserver[]=$obs;
            }
        }
        $this->observers=$newObserver;
    }
    //通知所有观察者
    function notify(){
        foreach ($this->observers as $bos){
            $bos->update($this);
        }
    }
}
//观察者接口
interface Observer{
    function update(Observable $observable);
}
class SecurityMonitor implements Observer{
    function update(Observable $observable){
        //getStatus()不是Observable接口规定的方法
        $status=$observable->getStatus();
        //对status的判断也涉及到耦合问题
        if($status[0]==Login::LOGIN_WRONG_PASS){
            //发送邮件给管理员
            print __CLASS__.":\t sending mail to sysadmin\n";
        }
    }
}
$login=new Login();
$login->attach(new SecurityMonitor());
$login->handleLogin("coco", "123456", "127.0.0.1");//有可能输出发送消息到管理员

 *改进后的观察者模式

//可观察元素:主体类的基接口
interface Observable{
    //附加
    function attach(Observer $observer);
    //删除
    function detach(Observer $observer);
    //通知
    function notify();
}
// Login类(主体类)
class Login implements Observable{
    const LOGIN_USER_UNKNOWN = 1;
    const LOGIN_WRONG_PASS = 2;
    const LOGIN_ACCESS = 3;
    private $observers;
    private $status = array ();
    // 登录操作
    function handleLogin($user, $pass, $ip) {
        $ret=false;
        switch (rand ( 1, 3 )) {
            case 1 :
                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );
                $ret=ture;
                break;
            case 2 :
                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );
                $ret=false;
                break;
            case 3 :
                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );
                $ret=false;
                break;
            default:
                $ret=false;
        }
        //使用观察者模式之后,如果需要增加新功能,只需要在本类中添加观察者实例即可...
        $this->notify();
        return $ret;
    }
    function setStatus($status, $user, $ip) {
        $this->status = array ($status,$user,$ip);
    }
    function getStatus(){
        return $this->status;
    }
    function attach(Observer $observer){
        $this->observers[]=$observer;
    }
    function detach(Observer $observer){
        $newObserver=array();
        foreach ($this->observers as $obs){
            if($obs!==$observer){
                $newObserver[]=$obs;
            }
        }
        $this->observers=$newObserver;
    }
    //通知所有观察者
    function notify(){
        foreach ($this->observers as $bos){
            $bos->update($this);
        }
    }
}
//观察者接口
interface Observer{
    function update(Observable $observable);
}
//Login:观察者超类(用于解决直接在Observer中调用具体的Observable子类造成的风险)
abstract class LoginObserver implements Observer{
    private $login;
    function __construct(Login $login){
        $this->login=$login;
        $this->login->attach($this);
    }
    //该方法在Observable的子类某些方法被调用时触发
    function update(Observable $observable){
        //触发该方法时,传入的参数必须是Login才有效...
        if($this->login===$observable){
             $this->doUpdate($observable);
        }
    }
    abstract function doUpdate(Login $login);
    
}
//改进后的观察者能保证调用的Observable实例方法一定存在
class SecurityMonitor extends LoginObserver{
    function doUpdate(Login $login){
        $status=$login->getStatus();
        //对status的判断也涉及到耦合问题
        if($status[0]==Login::LOGIN_WRONG_PASS){
            //发送邮件给管理员
            print __CLASS__.":\t sending mail to sysadmin\n";
        }
    }
}
//日常记录
class GeneralLogger extends LoginObserver{
    function doUpdate(Login $login){
        $status=$login->getStatus();
        //添加记录到log中
        //...
        print __CLASS__."\t add login data to log\n";
    }
}
//合作伙伴工具类
class PartnershipTool extends LoginObserver{
    function doUpdate(Login $login){
        $status=$login->getStatus();
        //检查IP,如果匹配,则设置cookie...
        //...
        print __CLASS__."\t set cookie if IP matches a list\n";
    }
}
//客户端代码有一点点改变...
$login=new Login();
new SecurityMonitor($login);
new GeneralLogger($login);
new PartnershipTool($login);
$login->handleLogin("coco", "123456", "127.0.0.1");
/*
 * 有可能输出
 *SecurityMonitor:     sending mail to sysadmin
 *GeneralLogger     add login data to log
 *PartnershipTool    set cookie if IP matches a list
 **/

4. 访问者模式
       当使用对象集合时,我们可能需要对结构上每一个单独的组件应用各种操作.这样的操作可以内建于组件本身,毕竟组件内部调用其他组件是最方便的. 
       但是这种方法也存在问题,因为我们并不知道所有可能需要的执行的操作.如果每增加一个操作,就在类中增加一个对于新操作的支持,类就会变得越来越臃肿.访问者模式可以解决这个问题.

//本例是基于"文明"游戏的代码建立而成...
//*战斗单元类
abstract class Unit{
    //深度
    protected $depth=0;
    //攻击强度
    abstract function bombardStrength();
    function getComposite(){
        return null;
    }
    //为访问者模式打造的方法
    function accept(ArmyVisitor $visitor){
        //构建一个根据自己规则定义的方法名,然后交给visitor自身调用
        $method="visit".get_class($this);
        $visitor->$method($this);
    }
    //用于计算Unit在对象树中的深度
    protected function setDepth($depth){
        $this->depth==$depth;
    }
    function getDepth(){
        return $this->depth;
    }
}
//复合抽象类
abstract class CompositeUnit extends Unit{
    protected $units=array();
    //为访问者模式打造的方法
    function accept(ArmyVisitor $visitor){
        //构建一个根据自己规则定义的方法名,然后交给visitor自身调用
        //先调用父类accept(),再遍历调用子元素accept()
        parent::accept($visitor);
        foreach ($this->units as $thisunit){
            $thisunit->accept($visitor);
        }
    }
    //可以不用写bombardStrength()
    function getComposite(){
        return $this;
    }
    //添加单元
    //同时标记节点在对象树中的深度
    function addUnit(Unit $unit){
        if(!empty($unit)){
            if(in_array($unit, $this->units,true)){
                return;
            }
            //可以用下面代码替换in_array()函数
//             foreach ($this->units as $thisunit){
//                 if($thisunit===$unit){
//                     return;
//                 }
//             }
            //计算好深度先...
            $unit->setDepth($this->depth+1);
            array_push($this->units, $unit);
        }
    }
    function removeUnit(Unit $unit){
        $this->units=array_udiff($this->units, array($unit), function ($a,$b){return ($a===$b?0:1);});
    }
    
}
//射手
class Archer extends Unit{
    function bombardStrength(){
        return 4;
    }
}
//激光塔
class LaserCannonUnit extends Unit{
    function bombardStrength(){
        return 44;
    }
}
//军队:由战斗单元组成
class Army extends CompositeUnit{
    //计算总强度
    function bombardStrength(){
        $ret=0;
        foreach ($this->units as $unit){
            $ret+=$unit->bombardStrength();
        }
        return $ret;
    }
    //移动能力,防御能力...省略
}
//运兵船:一个类似军队的单元,它具备10个战斗单元,有攻击力
class TroopCarrier extends CompositeUnit{
    //具备和军队差不多的方法和属性
    function bombardStrength(){
        //Do something...
    }
}
//军队访问者基类
abstract class ArmyVisitor{
    //相关方法待会写...
    //Army可能有多少种Unit,这里就有多少个visit方法...
    //方法命名规则为visit+类名
    //默认的visit
    abstract function visit(Unit $unit);
    function visitArcher(Archer $node){
        $this->visit($node);
    }
    function visitLaserCannonUnit(LaserCannonUnit $node){
        $this->visit($node);
    }
    function visitArmy(Army $node){
        $this->visit($node);
    }
    function visitTroopCarrier(TroopCarrier $node){
        $this->visit($node);
    }
}
//具体的Army访问者类,用于转存文本
class TextDumpArmyVisitor extends ArmyVisitor{
    private $text="";
    function visit(Unit $node){
        $ret="";
        $pad=4*$node->getDepth();
        $ret.=sprintf("%{$pad}s","");
        $ret.=get_class($node).":";
        $ret.="bombard: ".$node->bombardStrength()."\n";
        $this->text.=$ret;
    }
    function getText(){
        return $this->text;
    }
}
//客户端实例代码
$army=new Army();
$army->addUnit(new Archer());
$army->addUnit(new LaserCannonUnit());
$textdump=new TextDumpArmyVisitor();
$army->accept($textdump);
print $textdump->getText();
/*  
 *  Army:bombard: 48
 *  Archer:bombard: 4
 *  LaserCannonUnit:bombard: 44
 */

5. 命令模式
//命令模式
//命令模式最初来源于图形化用户界面设计,但现在广泛应用于企业应用设计,特别促进了控制器(请求和分法处理)
//和领域模型(应用逻辑)的分离.说得更简单一点,命令模式有助于系统更好地进行组织,并易于扩展
//Command可以设计成接口,因为它很简单...
//Commands/Command.php
abstract class Command{
    abstract function execute(CommandContext $context);
}  
require_once("Command.php");
class Registry{
    //一个空类...
    static function getAccessManager(){
        return new AccessManager();
    }
}
class AccessManager{
    function login(){
        return new stdClass();
    }
    function getError(){}
}
class LoginCommand extends Command{
    function execute(CommandContext $context){
        $manager=Registry::getAccessManager();
        $user=$context->get('username');
        $user=$context->get('pass');
        //虚构出来的空类空方法
        $user_obj=$manager->login();
        if(is_null($user_obj)){
            $context->setError($manager->getError());
            return false;
        }
        $context->addParam("user", $user);
        return true;
    }
}  
//CommandContext类用来做任务扩增用,在这儿主要功能是传递数据给Command类
class CommandContext{
    private $params=array();
    private $error="";
    function __construct(){
        $this->params=$_REQUEST;
    }
    function addParam($key,$val){
        $this->params[$key]=$val;
    }
    function get($key){
        return $this->params[$key];
    }
    function setError($error){
        $this->error=$error;
    }
    function getError(){
        return $this->error;
    }
}
//客户端代码(用于创建命令)已经调用者代码
class CommandNotFoundException extends Exception{
    
}
//创建命令的工厂
class CommandFactory{
    private static $dir="Commands";
    //根据参数action,以及类文件存放目录$dir动态创建相应的$action+Command类
    static function getCommand($action='default'){
        //匹配是否出现非法字符(非字母数字下划线)
        if(preg_match('/\W/', $action)){
            throw new Exception("Illegal characters in action");
        }
        $class=ucfirst(strtolower($action)."Command");
        $file=self::$dir.DIRECTORY_SEPARATOR."{$class}.php";
        if(!file_exists($file)){
            throw new CommandNotFoundException("File could not be find !");
        }
        require_once("$file");
        if(!class_exists($class)){
            throw new CommandNotFoundException("Class could not be find !");
        }
        return new $class();
    }
}
//调用者,里面包含一个CommandContext对象实例,用于存放web请求的数据
class Controller{
    private $context;
    function __construct(){
        $this->context=new CommandContext();
    }
    function getContext(){
        return $this->context;
    }
    function process(){
        $cmd=CommandFactory::getCommand($this->getContext()->get('action'));
        if(!$cmd->execute($this->context)){
            //处理失败
            print "Faile in process!";
        }else{
            //处理成功,可以显示相应的视图层
            print "Success in process!";
        }
    }
}
$controller=new Controller();
$context=$controller->getContext();
$context->addParam('action', 'Login');
$context->addParam('user', 'cocos');
$context->addParam('pass', 'tiddles');
//controller执行process方法,需要不理解command的意义.
$controller->process();//Success in process









로그인 후 복사


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Goat Simulator 3에서 공포 복도 임무를 완료하는 방법 Goat Simulator 3에서 공포 복도 임무를 완료하는 방법 Feb 25, 2024 pm 03:40 PM

Terror Corridor는 Goat Simulator 3의 임무입니다. 이 임무를 어떻게 완료할 수 있습니까? 자세한 정리 방법과 해당 프로세스를 숙지하고 이 임무의 해당 과제를 완료할 수 있으면 Goat Simulator 3가 제공됩니다. 관련 정보를 배울 수 있는 안내입니다. Goat Simulator 3 Terror Corridor 가이드 1. 먼저 플레이어는 지도의 왼쪽 상단에 있는 Silent Hill로 이동해야 합니다. 2. 지붕에 RESTSTOP이라고 적힌 집이 보입니다. 플레이어는 이 집에 들어가려면 염소를 조작해야 합니다. 3. 방에 들어간 후 먼저 직진하다가 여기 끝에 문이 있고 여기서 바로 들어갑니다. 4. 들어간 후에도 먼저 앞으로 걸어간 다음 여기 문에 도달하면 문이 닫혀 있어야합니다.

Goat Simulator 3에서 Imperial Tomb 미션을 통과하는 방법 Goat Simulator 3에서 Imperial Tomb 미션을 통과하는 방법 Mar 11, 2024 pm 01:10 PM

Goat Simulator 3는 고전적인 시뮬레이션 게임플레이를 갖춘 게임으로, 플레이어는 캐주얼 액션 시뮬레이션의 재미를 완전히 경험할 수 있습니다. 이 게임에는 또한 많은 흥미로운 특수 작업이 있으며, 그 중 Goat Simulator 3 Imperial Tomb 작업에서는 플레이어가 종탑을 찾아야 합니다. 일부 플레이어는 세 개의 시계를 동시에 작동하는 방법을 잘 모릅니다. 다음은 Goat Simulator 3의 Tomb of the Tomb 미션에 대한 가이드입니다! 순서대로. 세부 단계 확장 1. 먼저 지도를 열고 Wuqiu Cemetery로 이동해야 합니다. 2. 그런 다음 종탑으로 올라가면 내부에 3개의 종이 있을 것입니다. 3. 그리고 큰 것부터 작은 것 순으로 222312312를 따라가면서 화난 두드리기에 익숙해지세요. 4. 노크를 완료한 후 미션을 완료하고 문을 열어 광선검을 획득할 수 있습니다.

수정: Windows 작업 스케줄러에서 운영자 거부 요청 오류 수정: Windows 작업 스케줄러에서 운영자 거부 요청 오류 Aug 01, 2023 pm 08:43 PM

작업을 자동화하고 여러 시스템을 관리하기 위해 임무 계획 소프트웨어는 특히 시스템 관리자에게 유용한 도구입니다. Windows 작업 스케줄러는 작업을 완벽하게 수행하지만 최근 많은 사람들이 운영자 거부 요청 오류를 보고했습니다. 이 문제는 운영 체제의 모든 반복에 존재하며 널리 보고되고 다루어졌음에도 불구하고 효과적인 해결책은 없습니다. 다른 사람들에게 실제로 효과가 있을 수 있는 것이 무엇인지 알아보려면 계속해서 읽어보세요! 운영자 또는 관리자가 거부한 작업 스케줄러 0x800710e0의 요청은 무엇입니까? 작업 스케줄러를 사용하면 사용자 입력 없이 다양한 작업과 응용 프로그램을 자동화할 수 있습니다. 이를 사용하여 특정 애플리케이션을 예약 및 구성하고, 자동 알림을 구성하고, 메시지 전달을 돕는 등의 작업을 할 수 있습니다. 그것

WeChat의 방해금지 모드는 무엇을 합니까? WeChat의 방해금지 모드는 무엇을 합니까? Feb 23, 2024 pm 10:48 PM

WeChat 방해금지 모드는 무엇을 의미합니까? 요즘 스마트폰의 인기와 모바일 인터넷의 급속한 발전으로 인해 소셜 미디어 플랫폼은 사람들의 일상 생활에 없어서는 안될 부분이 되었습니다. WeChat은 중국에서 가장 인기 있는 소셜 미디어 플랫폼 중 하나이며 거의 모든 사람이 WeChat 계정을 가지고 있습니다. 우리는 위챗을 통해 친구, 가족, 동료들과 실시간으로 소통하고, 삶의 모든 것을 공유하고, 서로의 현재 상황을 배울 수 있습니다. 그러나 이 시대에 우리는 또한 정보의 과잉과 개인정보 유출의 문제에 필연적으로 직면하게 됩니다. 특히 집중하거나 집중해야 하는 사람들에게는 더욱 그렇습니다.

Goat Simulator 3에서 스티브 구출 임무를 수행하는 방법 Goat Simulator 3에서 스티브 구출 임무를 수행하는 방법 Feb 25, 2024 pm 03:34 PM

Steve 구출은 Goat Simulator 3의 독특한 작업입니다. 이 작업을 완료하려면 정확히 무엇을 해야 할까요? 이 작업은 상대적으로 간단하지만 의미를 오해하지 않도록 주의해야 합니다. 여기서는 Goat Simulator에서 Steve를 구출하도록 안내하겠습니다. 3 작업 전략은 관련 작업을 더 잘 완료하는 데 도움이 될 수 있습니다. 염소 시뮬레이터 3 스티브 구출 미션 전략 1. 먼저 지도 오른쪽 하단에 있는 온천으로 가세요. 2. 온천에 도착하면 스티브 구출 임무를 시작할 수 있습니다. 3. 온천에 남자가 있다는 점에 유의하세요. 그의 이름은 스티브이지만 그는 이 임무의 대상이 아닙니다. 4. 이 온천에서 스티브라는 물고기를 찾아 해변으로 가져와 이 작업을 완료하세요.

iPhone에서 절전 모드는 무엇에 사용됩니까? iPhone에서 절전 모드는 무엇에 사용됩니까? Nov 04, 2023 am 11:13 AM

iOS 기기에서는 오랫동안 건강 앱을 사용하여 수면 패턴 등을 추적할 수 있었습니다. 그런데 자고 있는 동안 알림으로 방해를 받으면 짜증이 나지 않나요? 이러한 알림은 관련성이 없으므로 그 과정에서 수면 패턴을 방해할 수 있습니다. 방해금지 모드는 잠자는 동안 주의가 산만해지는 것을 피할 수 있는 좋은 방법이지만, 밤에 받는 중요한 전화와 메시지를 놓칠 수 있습니다. 고맙게도 여기에서 절전 모드가 시작됩니다. 이에 대해 자세히 알아보고 iPhone에서 사용하는 방법을 알아보세요. iPhone에서 수면 모드는 어떤 역할을 합니까? 수면 모드는 "건강" 앱의 수면 일정에 따라 자동으로 활성화되는 iOS의 전용 집중 모드입니다. 알람을 설정하는 데 도움이 됩니다.

Douyin 팬 그룹 작업은 어디에서 찾을 수 있나요? Douyin 팬클럽이 레벨을 잃을까요? Douyin 팬 그룹 작업은 어디에서 찾을 수 있나요? Douyin 팬클럽이 레벨을 잃을까요? Mar 07, 2024 pm 05:25 PM

현재 가장 인기 있는 소셜 미디어 플랫폼 중 하나인 TikTok은 많은 사용자의 참여를 유도하고 있습니다. Douyin에는 사용자가 특정 보상과 혜택을 얻기 위해 완료할 수 있는 팬 그룹 작업이 많이 있습니다. 그렇다면 Douyin 팬클럽 작업은 어디서 찾을 수 있나요? 1. 두인 팬클럽 과제는 어디서 볼 수 있나요? Douyin 팬 그룹 작업을 찾으려면 Douyin의 개인 홈페이지를 방문해야 합니다. 홈페이지에 보시면 '팬클럽'이라는 옵션이 보이실 겁니다. 이 옵션을 클릭하면 자신이 가입한 팬 그룹 및 관련 작업을 찾아볼 수 있습니다. 팬클럽 작업란에서는 좋아요, 댓글, 공유, 전달 등 다양한 종류의 작업을 확인할 수 있습니다. 각 작업에는 해당 보상과 요구 사항이 있습니다. 일반적으로 작업을 완료하면 일정량의 금화나 경험치를 받게 됩니다.

iPhone에서 방해 금지 모드가 작동하지 않음: 수정 iPhone에서 방해 금지 모드가 작동하지 않음: 수정 Apr 24, 2024 pm 04:50 PM

방해 금지 모드에서 전화를 받는 것조차 매우 짜증나는 경험이 될 수 있습니다. 이름에서 알 수 있듯이 방해 금지 모드는 모든 수신 전화 알림과 이메일, 메시지 등의 알림을 끕니다. 다음 솔루션 세트를 따라 문제를 해결할 수 있습니다. 수정 1 – 초점 모드 활성화 휴대폰에서 초점 모드를 활성화합니다. 1단계 – 위에서 아래로 스와이프하여 제어 센터에 액세스합니다. 2단계 – 다음으로 휴대폰에서 "초점 모드"를 활성화합니다. 집중 모드는 전화기에서 방해 금지 모드를 활성화합니다. 수신 전화 알림이 전화기에 표시되지는 않습니다. 수정 2 - 초점 모드 설정 변경 초점 모드 설정에 문제가 있는 경우 이를 수정해야 합니다. 1단계 – iPhone 설정 창을 엽니다. 2단계 – 다음으로 집중 모드 설정을 켭니다.

See all articles